如果 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);
给出以下错误:
- error C2664: 'std::vector>::vector(std::initializer_list,const std::allocator<_Ty> &)' : 无法将参数 1 从 'std::initializer_list,std::allocator>>' 转换为 'const std::allocator<_Ty> &'
2> [
2> _Ty=测试网络信息
2> ]
2> 原因:无法从 'std::initializer_list,std::allocator>>' 转换为 'const std::allocator<_Ty>'
2> 与
2> [
2> _Ty=测试网络信息
2> ]
2> 没有可用的可以执行此转换的用户定义转换运算符,或者无法调用该运算符
如果我将 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());
在 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);
给出以下错误:
- error C2664: 'std::vector>::vector(std::initializer_list,const std::allocator<_Ty> &)' : 无法将参数 1 从 'std::initializer_list,std::allocator>>' 转换为 'const std::allocator<_Ty> &' 2> [ 2> _Ty=测试网络信息 2> ] 2> 原因:无法从 'std::initializer_list,std::allocator>>' 转换为 'const std::allocator<_Ty>' 2> 与 2> [ 2> _Ty=测试网络信息 2> ] 2> 没有可用的可以执行此转换的用户定义转换运算符,或者无法调用该运算符
如果我将 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());