【发布时间】:2014-10-26 01:29:04
【问题描述】:
我喜欢 C++11 中的 auto。太棒了。但它有一个不一致的地方真的让我很紧张,因为我总是被它绊倒:
int i = 3; // i is an int with value 3
int i = int{3}; // i is an int with value 3
int i(3); // i is an int with value 3 (possibly narrowing, not in this case)
int i{3}; // i is an int with value 3
auto i = 3; // i is an int with value 3
auto i = int{3}; // i is an int with value 3
auto i(3); // i is an int with value 3
auto i{3}; // wtf, i is a std::initializer_list<int>?!
这种奇怪的行为让新手感到困惑,也让有经验的用户感到恼火——C++ 有足够少的不一致和极端情况,人们必须牢记这一点。谁能解释一下为什么标准委员会决定在这种情况下引入一个新标准?
如果声明std::initializer_list 类型的变量是有用的或经常做的事情,我可以理解,但根据我的经验,它几乎从不刻意——在极少数情况下你确实想要这样做,任何
std::initializer_list<int> l{3};
auto l = std::initializer_list<int>{3};
auto l = {3}; // No need to specify the type
会工作得很好。那么auto x{i} 的特殊情况背后的原因是什么?
【问题讨论】:
-
这就是为什么rule is going to change。
-
解决方案:不要在这些情况下使用 auto (除了 #2)。 :-)
-
如果你问“为什么 C++ 委员会做出了错误的设计选择,而他们现在正试图撤销”,那么,坦率地说,答案是“因为他们是人类并且因此,他们有时可能会做一些错误或有争议的事情“?”老实说,我想获得明确答案的唯一真正方法是直接询问委员会的一位成员。
标签: c++ c++11 auto initializer-list type-deduction