【发布时间】:2014-08-01 21:17:37
【问题描述】:
我在 VS 2013 中遇到编译器错误,其中我的自定义类存在歧义错误,但它对于 std::vector 没有歧义
#include <initializer_list>
#include <vector>
using namespace std;
class MyArray
{
public:
std::vector< int > values;
MyArray(int s) : values(s) { }
MyArray(std::initializer_list< int >list) { values = list; }
};
int main ()
{
vector<int> vx({9,8,7}); // Works
MyArray mx({9, 8, 7}); // Works
vector<int> vy({9}); // Works
MyArray my({9}); // VS-compiler complains about ambiguity
MyArray mz(std::initializer_list<int>{9}); // Works
}
当然,我可以通过显式添加类型来解决歧义:MyArray my(std::initializer_list<int>{9}),但这很不方便。 有没有办法对构造函数进行编码,以便 VS 不会抱怨我的类有歧义?
由于std::vector 没有给出歧义错误,所以看起来应该是可能的。
【问题讨论】:
-
这绝对是一个错误。如果您不使用括号,MSVC 会很高兴 -
MyArray my{9}; -
不,这将调用整数 ctor(设置大小),而不是按预期通过初始化列表设置内容。
-
不,它没有。它调用
initializer_list构造函数(应该如此)并将values向量初始化为包含9的单个元素 -
我的立场是正确的。这实际上可以解决我整个代码库的实际问题。
-
由于在 C++11 中编写
int x = { 5 };是完全合法的,看来 VS 编译器和我一样对 c++11 感到困惑 ;){9}可能是一个初始化器列表作为一个 "uniform initializer" 的 int。
标签: c++ visual-c++ visual-studio-2013