将字符串推回对象向量

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