如何使用转换构造函数初始化向量

时间:2016-01-29 10:54:21

标签: c++

我有两个课程,A可以从string构建,因此可以定义从stringA的转化。

class A
{
  public:

    A(std::string s) : s_(s) {}

  private:

    std::string s_;
};


class B
{
  public:

    B() : v_{"foo", "bar"} {}

  private:

    std::vector<A> v_;
};

B的{​​{1}}成员包含vector个对象。构造函数使用字符串初始化向量(A)。这不起作用。为什么呢?

2 个答案:

答案 0 :(得分:1)

基本上,您的std::vector<A>期望使用包含A个对象的初始化列表构建。编译器无法将std::string个对象的初始化列表隐式转换为包含A的对象,而其他std::vector构造函数都不会占用两个std::string(即使一个构造函数也是如此)是的,它可能没有你想要的意思)。

如果你写

B() : v_{A("foo"), A("bar")} {}

相反,它的工作原理。现在您有一个A s的初始化列表,可以正确解释。

答案 1 :(得分:1)

C ++不进行传递转换。请参阅the documentation here

  

用户定义的转换零或一个非显式单参数构造函数或非显式转换函数调用

组成

强调我的。所以当这样做时

vector<A>{"str"}

您实际上是在请求转换序列

const char* --> std::string --> A

由于那里有多个转换,因此无法编译。你需要一个才能使它工作,你可以通过发布

来实现
vector<A>{A("str")}