【发布时间】:2015-01-24 11:31:23
【问题描述】:
考虑代码
#include <iostream>
class Foo
{
int val_;
public:
Foo(std::initializer_list<Foo> il)
{
std::cout << "initializer_list ctor" << std::endl;
}
/* explicit */ Foo(int val): val_(val)
{
std::cout << "ctor" << std::endl;
};
};
int main(int argc, char const *argv[])
{
// why is the initializer_list ctor invoked?
Foo foo {10};
}
输出是
ctor
initializer_list ctor
据我了解,10 的值被隐式转换为Foo(第一个ctor 输出),然后初始化构造器启动(第二个initializer_list ctor 输出)。我的问题是为什么会这样?标准构造函数Foo(int)不是更好的匹配吗?即,我希望这个 sn-p 的输出只是 ctor。
PS:如果我将构造函数Foo(int) 标记为explicit,那么Foo(int) 是唯一调用的构造函数,因为整数10 现在不能隐式转换为Foo。
【问题讨论】:
-
我知道它胜过常规构造函数,但不知道即使常规构造函数更匹配,它也胜过。是的,这样似乎有点奇怪。有什么特别的原因吗?这样就可以隐藏复制构造函数了(其实我的代码会隐藏复制构造函数,不是吗?)
-
Scott Meyers 的新书《Effective Modern C++》中有一个关于各种初始化样式的非常好的条目:“条目 7:在创建对象时区分 () 和 {}”。它并没有提供太多行为的基本原理,但确实详细介绍了一些可能会让您感到惊讶的边缘情况。
-
@MichaelBurr 谢谢,我还在等实体版 :)
-
我知道这不相关,但谁能告诉我我应该在构造函数中按值还是按 const 引用来设置 initializer_list ?那是什么原因呢?
标签: c++ c++11 constructor language-lawyer initializer-list