我正在浏览我为学校项目编写的一些代码,经过仔细检查后我觉得很奇怪。我有一个类似下面的课程:
class Foo {
public:
Foo(std::string s) : _s(s) {}
private:
std::string _s;
};
int main() {
std::string str = "Hiyo";
std::vector<Foo> f;
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
?
答案 0 :(得分:16)
类Foo
有一个非显式的ctor,它接受std::string
类型的一个参数(即Converting constructor),这意味着它可以从std::string
隐式地转换。< / p>
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
答案 1 :(得分:7)
第一次回退将自动初始化给定Foo
对象的string
对象;通过初始化列表。
(期待一个Foo
对象,获取一个字符串:可以使用单个字符串初始化Foo
对象吗?是的,它的初始化列表具有单个元素,并且该对象是从该元素初始化的)。
有关详情,请参阅例如:
答案 2 :(得分:2)
我认为在第一次推迟时它会自动初始化Foo(str)
所以它基本相同!