如果foo有来自字符串的非显式构造函数,为什么我不能从std :: initializer_list <string>初始化vector <foo>?

时间:2016-07-07 01:26:58

标签: c++11 vector initializer-list

在MS Visual Studio 2013中使用C ++ 11,我有一个类testNetInfo,它有一个来自std :: string的非显式构造函数,我想从std :: initializer列表中构造一个这样的向量字符串。

如果我从initializer_list构造一个临时向量,我可以用它来设置真正的向量:

void SimComparisonTests::compareCombinationalGateWithXorZ(const std::string& outNetName, std::initializer_list<std::string> initList) {

std::vector<std::string> inNetNames(initList);
std::vector<testNetInfo> netInfo;
for (auto nn = inNetNames.begin(); nn != inNetNames.end(); ++nn) {
    netInfo.push_back(testNetInfo(*nn));
}

但是尝试直接从initList创建netInfo,如下所示:

std::vector<testNetInfo> netInfo(initList);

给出以下错误:

  • 错误C2664:'std :: vector&gt; :: vector(std :: initializer_list,const std :: allocator&lt; _Ty&gt;&amp;)':无法从'std :: initializer_list,std :: allocator&gt;转换参数1 &GT;”到'const std :: allocator&lt; _Ty&gt; &安培;”同 2 - ; [ 2 - ; _Ty = testNetInfo 2 - ; ] 2 - ;原因:无法从'std :: initializer_list,std :: allocator&gt;&gt;'转换到'const std :: allocator&lt; _Ty&gt;' 2 - ;同 2 - ; [ 2 - ; _Ty = testNetInfo 2 - ; ] 2 - ;没有可用于执行此转换的用户定义转换运算符,或者无法调用运算符

如果我将initList的类型更改为initializer_list<testNetInfo>,并从const char *添加构造函数,看起来我可以避免此错误,这样我就可以接听一个如下调用:

compareCombinationalGateWithXorZ("triOut3", {"triIn3", "triEn3"});

但是修复的一个可能问题是,在用于进行名称查找的testNetInfo中运行时分配类静态指针后,必须在字符串(或const char *)到testNetInfo对象之间进行转换。初始化对象的其余部分。这将在调用上述函数时完成,上面的初始化在我的实现中看起来没问题,但是我会通过声明一个具有运行时先决条件的类的initializer_list<testNetInfo>来推动未定义的行为(也就是说,实现可能会在执行调用者之前尝试构建initializer_list)?如果是这样,有更清洁的方法吗?

1 个答案:

答案 0 :(得分:1)

仅因为A可转换为B并不意味着initializer_list<A>可转换为initializer_list<B>。后两者是完全不相关的类型。

关于修复,只需使用范围构造函数。

std::vector<testNetInfo> netInfo(initList.begin(), initList.end());