将字符串推回到对象的向量

时间:2015-12-31 02:48:15

标签: c++ type-conversion implicit-conversion

我正在浏览我为学校项目编写的一些代码,经过仔细检查后我觉得很奇怪。我有一个类似下面的课程:

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

3 个答案:

答案 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) 所以它基本相同!