【发布时间】:2020-12-18 01:42:03
【问题描述】:
#include <iostream>
int main()
{
auto n {42};
cout << "The n has value of " << n <<
" and a size of " << sizeof(n) << endl; // Works as expected
}
#include <iostream>
int main()
{
auto n = {42};
cout << "The n has value of " << n <<
" and a size of " << sizeof(n) << endl; // Does not work!
}
这是为什么呢? 在“A Tour of C++”中明确表示:
1.4.2 初始化 在一个对象可以被使用之前,它必须被赋予一个值。 C++ 提供了多种表示法 表示初始化,例如上面使用的 =,以及基于花括号分隔的初始化列表的通用形式:
double d1 = 2.3; // initialize d1 to 2.3
double d2 {2.3}; // initialize d2 to 2.3
double d3 = {2.3}; // initialize d3 to 2.3 (the = is optional with { ... })
complex<double> z2 {d1,d2};
complex<double> z3 = {d1,d2}; // the = is optional with { ... }
= 是可选的 {}。
那么,为什么会这样呢?
【问题讨论】:
-
它工作得很好,但
{42}本身是std::initializer_list<int>,而不是int。创建一个由于其他原因而无法获得的变量的万无一失的方法是auto name = type{ args };— 实际上,如果类型不可移动构造,即使在 c++11 中也会遇到问题(这在 c 中已修复++17). -
Fwiw,this answer 展示了初始化列表、initializer_lists 和大括号初始化列表的微妙之处。
-
“不起作用!”?请说明它是如何不起作用的。如果有错误,请完整引用(不要发布屏幕截图)。