在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);
给出以下错误:
如果我将initList的类型更改为initializer_list<testNetInfo>
,并从const char *添加构造函数,看起来我可以避免此错误,这样我就可以接听一个如下调用:
compareCombinationalGateWithXorZ("triOut3", {"triIn3", "triEn3"});
但是修复的一个可能问题是,在用于进行名称查找的testNetInfo中运行时分配类静态指针后,必须在字符串(或const char *)到testNetInfo对象之间进行转换。初始化对象的其余部分。这将在调用上述函数时完成,上面的初始化在我的实现中看起来没问题,但是我会通过声明一个具有运行时先决条件的类的initializer_list<testNetInfo>
来推动未定义的行为(也就是说,实现可能会在执行调用者之前尝试构建initializer_list)?如果是这样,有更清洁的方法吗?
答案 0 :(得分:1)
仅因为A
可转换为B
并不意味着initializer_list<A>
可转换为initializer_list<B>
。后两者是完全不相关的类型。
关于修复,只需使用范围构造函数。
std::vector<testNetInfo> netInfo(initList.begin(), initList.end());