为什么用A {8}初始化的对象不能作为参数传递?

时间:2013-02-17 10:59:38

标签: c++ types c++11 initialization initializer-list

以下代码是使用VC ++ 2012年11月的CTP编译的。

#include <iostream>

using namespace std;

struct A
{
    A(int n)
    {
        cout << n << endl;
    }
};

void f(A)
{}

int main()
{
    A {8}; // OK. A::A(8); is called;

    cout << typeid(decltype(A {8})).name() << endl; // Output 'struct A'

    f(A {8}); // error C2275: 'A' : illegal use of this type as an expression    
}

Q1:为什么是f(A {8});不合法吗?

Q2:为什么A {8}不被视为A的实例?

更新:

此问题似乎是VC ++ 2012年11月CTP的错误。

1 个答案:

答案 0 :(得分:0)

A {8}是一个带有扩展初始化列表的声明。您不能在C ++ 11之前使用扩展初始化列表。但你可以改为调用构造函数。

使用C ++ 11,您的代码是正确的。