我有两个课程,A
可以从string
构建,因此可以定义从string
到A
的转化。
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
)。这不起作用。为什么呢?
答案 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")}