相关疑难解决方法(0)

当它们应用于构造函数时,在括号初始化列表中是否存在序列点?

根据n4296 C++标准文档:

[dcl.init.list](8.5.4.4)(第223-224页)

在braced-init-list的initializer-list中,initializer-clauses(包括pack扩展(14.5.3)产生的任何结果)按照它们出现的顺序进行评估.也就是说,与给定初始化子句相关联的每个值计算和副作用在每个值计算和副作用之前与在初始化列表的逗号分隔列表中跟随它之后的任何初始化子句相关联.[注意:无论初始化的语义如何,此评估顺序都保持不变; 例如,当initializer-list的元素被解释为构造函数调用的参数时,它适用,即使通常对调用的参数没有排序约束. - 尾注]

(强调我的)

该说明在此处添加:http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1030

这告诉我以下代码:

#include <iostream>

struct MyType {
  MyType(int i, int j, int k, int l)
    : sum(i + j + k + l)
  {

  }

  int sum;
};

int main()
{
  int i = 0;
  std::cout << MyType{ ++i, ++i, ++i, ++i }.sum << '\n';
}
Run Code Online (Sandbox Code Playgroud)

应打印"10".

这是我的理由:

  • MyType正在通过braced-init-list初始化
  • braced-init-lists按顺序进行评估
  • 即使它被解释为构造函数调用的参数
  • 这意味着它应该被评估为MyType(1,2,3,4)

也就是说,上面的代码应该与此代码完全相同:

#include <initializer_list>
#include <iostream>

int main()
{
  int i = 0;
  std::initializer_list<int> il{++i, ++i, …
Run Code Online (Sandbox Code Playgroud)

c++ gcc clang visual-c++ c++11

20
推荐指数
2
解决办法
632
查看次数

标签 统计

c++ ×1

c++11 ×1

clang ×1

gcc ×1

visual-c++ ×1