'for i = 0'与'for'循环中的'int i(0)'(分配vs初始化count变量)

Cro*_*oCo 13 c++

我在教科书和论坛中看到了很多代码,人们在for循环初始化中使用赋值运算符来开始重复.例如,

for ( int i = 0; i < 5; ++i )   // common 
for ( int i(0);  i < 5; ++i ) // uncommon 
Run Code Online (Sandbox Code Playgroud)

我知道初始化变量比分配变量更快.为什么人们更喜欢前者呢?

oua*_*uah 27

int i = 0;int i(0);声明,定义并初始化一个int与值对象0在C++中.它们是严格等价的,两个循环结构也是如此.请注意,在C中,int i(0);不是允许的构造.

  • @AerofoilKite:并非所有人都这样做.那些在C++之前学过C的人可能更喜欢前者的熟悉程度. (4认同)
  • @Rinzler他们在这种情况下没有优势.有时他们会更好.有关详细信息,请参阅[此处](http://herbsutter.com/2013/05/09/gotw-1-solution/). (3认同)
  • @Rinzler:对于像这样的简单类型,大括号初始化等同于其他样式,并没有特别的理由更喜欢它们.它有各种用途,包括避免"最烦恼的解析"(例如`int i();`不声明变量,但`int i {};`确实),以及类似`std :: vector`的类允许从元素列表初始化. (3认同)
  • @AerofoilKite可能第一个版本更惯用,因为它更接近C89 for循环`for(i = 0; i <5; ++ i)`. (2认同)
  • @MikeSeymour:`int i();`是_not_"最令人烦恼的解析". (2认同)
  • @LightnessRacesinOrbit:这取决于你发现各种解析怪癖的糟糕程度.该术语没有"官方"含义; 我用它来表示对语言结构的任何意外解释,无论迈耶斯在创造这个术语时可能会特别谈论什么. (2认同)
  • @MikeSeymour:你认为C++ 03的`foo <3> 2>`是一个最令人烦恼的解析的例子吗? (2认同)

rav*_*avi 9

您提到的两种初始化形式是: -

T t = u;     _1
T t(u);      _2
Run Code Online (Sandbox Code Playgroud)

_1

可能涉及两个电话.一个是转换构造函数,另一个是复制构造函数.虽然大多数编译器都可以忽略复制构造.

_2

这只需要一次调用转换构造函数.

所以,_2优于_1.至于内置类型,它不会有太大的区别.

  • @Kiran:如果禁用复制省略,任何编译器都可以调用`_1`的复制构造函数.如果它选择忽略副本,则可能不会,因为这是允许该优化的一种情况(从相同类型的临时对象初始化).在`_2`中直接初始化不会调用复制构造函数.对于班级类型,答案是正确的; 而且,正如它所说,琐碎的类型几乎没有什么区别. (4认同)
  • 如果复制构造函数是私有的,那么g ++ 4.8.3不会编译第一个示例,而是编译第二个示例.(这似乎是正确的行为,但我没有阅读标准 - VS2013编译两种情况).我会说这是一个比一个可能的性能差异更重要的区别. (4认同)
  • 为什么这个答案被赞成?如果有一个支持`T t(u);`的构造函数,在特殊情况下`T t = u;`将不涉及2个调用.它将调用构造函数或复制构造函数.如果不是,请发布样本,我将推翻投票.我刚试过gcc (2认同)