【发布时间】:2015-07-23 17:52:06
【问题描述】:
我遇到了this 文章,我在其中阅读了其中一位海报的这个例子。为了方便,我在这里引用了。
struct Foo
{
Foo(int i) {} // #1
Foo() {}
};
int main()
{
std::vector<Foo> f {10};
std::cout << f.size() << std::endl;
}
上面的代码,如所写,发出“1”(10 是由 a 转换为 Foo 构造函数接受一个 int,然后是向量的 initializer_list 构造函数被调用)。如果我注释掉注释为 #1 的行,则 结果是“10”(initializer_list 无法转换,因此 int 使用构造函数)。
我的问题是,如果删除了 int 构造函数,为什么它会发出 10。 我了解统一初始化列表按以下顺序工作
1-Calls the initializer list if available or possible
2-Calls the default constructor if available
3-Does aggregate initialization
在上述情况下,为什么它在向量中创建 10 个项目,因为 1,2 和 3 是不可能的?这是否意味着通过统一初始化,项目向量可能总是具有不同的行为?
【问题讨论】:
-
您的术语似乎不对。默认 c'tor 是可以在没有参数的情况下调用的那个(如果有多个这样的 c'tor,由于默认参数,那么使用它的尝试将是模棱两可的)。不能在这里调用它,因为这需要空的或没有括号/大括号。聚合初始化仅适用于没有构造函数的 POD,不适用于 std::vector(例如用于 std::array 和其他 C 样式结构)。如果您将 2. 更改为“调用具有兼容参数类型的构造函数”,它会更有意义,但聚合 init.和 c'tors 真的是非此即彼。
-
澄清一下(我用完了字符):聚合初始化绝不是调用某些构造函数的后备。仅当类或结构根本没有构造函数时才可用。因此,如果一个类有一个构造函数,但既不能调用带有 std::initializer_list 的构造函数,也不能调用具有兼容参数的构造函数,则不会回退到聚合初始化。相反,程序格式错误。
-
@ArneVogel 答案属于答案 - 不要写多段 cmets...