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

Why can't I initialize vector<foo> from std::initializer_list<string> if foo has a non-explicit constructor from string?

在 MS Visual Studio 2013 中使用 C++11,我有一个 class 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"});

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

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

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

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