2

次のコードは、VC++ Nov 2012 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++ Nov 2012 CTP のバグのようです。

4

1 に答える 1

0

{8} は、拡張初期化子リストを使用した宣言です。C++11 より前の拡張イニシャライザ リストは使用できません。ただし、代わりにコンストラクターを呼び出すことができます。

C++11 では、コードは正しいです。

于 2013-02-17T11:13:05.800 に答える