【问题标题】:A very strange way of writing arrays [duplicate]一种很奇怪的数组写法[重复]
【发布时间】:2022-01-16 04:45:52
【问题描述】:
template<typename T>
void print(T &t) {
    cout << t << " ";
}

template<typename ...Ts>
void gogo(Ts&& ...agvs) {
    int arr[] = {  (print(agvs),0)... };
    cout << "\n";
    for (auto vi:arr)
        cout << vi << " ";
}

template<typename ...Ts>
void go(Ts&& ...agv) {
    gogo(forward<Ts>(agv)...);
}

以下是实际调用

enter image description here

enter image description here

我不明白这个(print(agvs),0)...

为什么会这样?

【问题讨论】:

标签: c++ arrays templates initialization comma-operator


【解决方案1】:

这个表达式

(print(agvs),0)

是带有逗号运算符的表达式。它的值是第二个操作数的值。

来自 C++ 14 标准(5.19 逗号运算符)

1 逗号运算符从左到右分组。一对表情 用逗号分隔从左到右计算;左边的表达式 是一个废弃的值表达式(第 5 条)。87 每个值计算 并且与左表达式相关的副作用被排序 在与相关的每个值计算和副作用之前 正确的表达。结果的类型和值是类型和 右操作数的值;结果是相同的值类别 作为它的右操作数,并且如果它的右操作数是一个位域 glvalue 和一个位域。如果右操作数的值是 临时的(12.2),结果就是临时的。

所以数组是零初始化的。这种初始化的副作用是输出传递给函数参数。

【讨论】:

    【解决方案2】:

    这只是逗号运算符。它评估 LHS 后跟 RHS,并返回 RHS 的值。

    这样

    print(agvs),0
    

    首先评估print(agvs),然后评估0。整个表达式的计算结果为 0。

    ...parameter pack expansion。编译器将为agvs 中的每个值插入(print(agvs),0),其中agvs 被实际值替换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-16
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 2021-11-12
      • 2021-05-11
      相关资源
      最近更新 更多