【发布时间】:2014-10-25 22:35:01
【问题描述】:
我有以下代码:
struct X
{
int a, b;
};
class Y
{
public:
Y(const X& x) : x_{x} {}; // C2797 error
private:
X x_;
};
使用 MSVC2013 Update 3 编译,它抱怨 C2797 error。如果我用括号(即x_(x))替换花括号,程序编译成功。
为什么会这样?此编译器行为是否符合 C++11?那么 C++14 呢?
编辑:更清楚地说,我不确定上面的x_{x} 是否应该根据标准调用X(std::initializer_list),或者它是否是调用X(const X&) 的有效语法。据我所知,是后者。我说的对吗?
【问题讨论】:
-
是的。如果您暗示答案就在那里,我不明白,如果您能在此处的答案中指出,我将不胜感激。
-
@Dan:您正在使用列表初始化
{},并在成员初始化列表中这样做。错误消息说这是合法的事情,但编译器还没有准备好让你这样做。尝试x_(x)作为解决方法,这是直接初始化,而不是列表初始化。 -
@Ben:所以如果我理解正确,你是说
{}初始化是合法的,但它只是没有在这个编译器中实现? -
@Dan:是的。更有可能的是,在这种特殊情况下决定它是否合法的编译器部分也尚未实现。由于您的
struct X是一个聚合,我将使用大括号{}进行聚合初始化(一种特殊形式的列表初始化),并使用()进行复制构造,这就是您在这里所拥有的。 -
@Ben:谢谢。请将此表述为一个简短的答案。
标签: c++ c++11 visual-studio-2013 initialization uniform-initialization