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

Why can an object initialized with A{8} not be passed as an argument?

本文关键字:不能 对象 参数传递 初始化 为什么      更新时间:2023-10-16

以下代码是用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的一个错误

A{8}是一个带有扩展初始值设定项列表的声明。在C++11之前不能使用扩展的初始值设定项列表。但是您可以直接调用构造函数。

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