将字符串推回对象向量
Pushing back string to vector of objects
我正在浏览我为学校项目编写的一些代码,仔细检查后我觉得这些代码很奇怪。我有一个 class 类似于下面的:
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
?
给定一个string
对象,第一次推回会自动初始化一个Foo
对象;通过你的初始化列表。
(期望一个 Foo
对象,得到一个字符串: Foo
对象可以用单个字符串初始化吗?是的,它的初始化列表只有一个元素,对象是从那个元素初始化的).
详情见例:
我认为在第一次推回中它会自动初始化 Foo(str)
所以它基本上是一样的!
Class Foo
有一个 non-explicit 构造函数接受一个 std::string
类型的参数(即 Converting constructor),这意味着它可以从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
请注意,如果您创建构造函数 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
我正在浏览我为学校项目编写的一些代码,仔细检查后我觉得这些代码很奇怪。我有一个 class 类似于下面的:
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
?
给定一个string
对象,第一次推回会自动初始化一个Foo
对象;通过你的初始化列表。
(期望一个 Foo
对象,得到一个字符串: Foo
对象可以用单个字符串初始化吗?是的,它的初始化列表只有一个元素,对象是从那个元素初始化的).
详情见例:
我认为在第一次推回中它会自动初始化 Foo(str)
所以它基本上是一样的!
Class Foo
有一个 non-explicit 构造函数接受一个 std::string
类型的参数(即 Converting constructor),这意味着它可以从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
请注意,如果您创建构造函数 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