为什么初始化列表不能用作参数?

5
struct X
{
    int a;
    int b;
};

int f(X x)
{
    return x.a + x.b;
}

int main()
{
    int n = f({1, 2});
}

Visual Studio 2012(Nov CTP)报告:

error C2664: 'int f(const X &)' : cannot convert parameter 1 from
'initializer-list' to 'X'

Reason: cannot convert from 'initializer-list' to 'X'
Only an initializer-list with zero or one elements can be converted to this type

Build FAILED.

2
Clang 3.1和g++ 4.7.2编译此代码时没有任何错误。 - awesoon
那么这似乎是VC++的一个bug,尽管它声明支持此功能。 - xmllmx
VC++ 众所周知在不同的部分存在问题。 - oblitum
1
@xmllmx:社区技术预览版就是一个预览版。想象一下alpha质量,并且预期会存在bug。 - ildjarn
2个回答

2

Visual Studio 2012(Nov CTP)报告:

这甚至不是一个beta编译器。它应该可以工作。我想链接到您在ideaone上的代码工作情况,但是这个网站不允许我这样做。

提交一个错误报告。


2
顺便说一下,这是Ideaone链接,该网站不允许我使用。 - Nicol Bolas

1

如果你想将初始化列表样式语法传递给你的构造函数,那么你必须向构造函数传递一个std::initializer_list类型。当传递一个{ }语法样式的构造时,该类型将构造一个你的类型数组。


我认为这种风格非常具有表现力。为什么标准不支持它呢? - xmllmx
2
如果我必须添加一个构造函数,那么 X 就不再是 POD 类型,而这正是我想要的。 - xmllmx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接