我正在浏览我为学校项目编写的一些代码,经过仔细检查,我觉得很奇怪.我有一个类似下面的类:
class Foo { public: Foo(std::string s) : _s(s) {} private: std::string _s; }; int main() { std::string str = "Hiyo"; std::vectorf; f.push_back(str); // Compiles. Weird to me though. f.push_back(Foo(str)); // Predictably, this compiles as well. return 0; }
为什么第一次调用push_back
有效语句,即使str
不是Foo
?
类Foo
有一个非显式的ctor,它接受一个类型的参数std::string
(即转换构造函数),这意味着它可以隐式地从a中转换出来std::string
.
f.push_back(str); // implicit casting from std::string to Foo f.push_back(Foo(str)); // explicit casting from std::string to Foo
请注意,如果您制作了ctor explicit
,则会禁止隐式转换.
class Foo { public: explicit Foo(std::string s) : _s(s) {} // ~~~~~~~~ private: std::string _s; };
然后
f.push_back(str); // invalid now f.push_back(Foo(str)); // still valid
第一次回退将自动初始化Foo
给定string
对象的对象; 通过初始化列表.
(期望一个Foo
对象,获取一个字符串:可以Foo
用一个字符串初始化一个对象吗?是的,它的初始化列表有单个元素,并且该对象是从该元素初始化的).
有关详细信息,请参阅:
http://en.cppreference.com/w/cpp/language/initializer_list