11
int main(){
    int x{};
    auto x2 = x;
    auto x3{x};

    static_assert(is_same<int, decltype(x)>::value, "decltype(x) is the same as int");
    static_assert(is_same<int, decltype(x2)>::value, "decltype(x2) is the same as int");
    static_assert(is_same<int, decltype(x3)>::value, "decltype(x3) is the same as int"); // Error here.
}

このコードは gcc 4.8.0 ではコンパイルできません。の型もわかりませんdecltype(x3)。それは何ですか?そして、なぜ行動が異なるのですか?

4

2 に答える 2

12
#include <initializer_list>
#include <type_traits>

using namespace std;

int main(){
    int x{};
    auto x2 = x;
    auto x3{x};

    static_assert(is_same<int, decltype(x)>::value, "decltype(x) is the same as int");
    static_assert(is_same<int, decltype(x2)>::value, "decltype(x2) is the same as int");
    static_assert(is_same<std::initializer_list<int>, decltype(x3)>::value, "decltype(x3) is the same as int");
}

これはコンパイルされます。は次の理由によるx3と推定されます。std::initializer_list<int>

変数T識別子に対して決定された型としますdP初期化子がブレース初期化リスト (8.5.4) の場合、T [...] から取得しstd::initializer_list<U>ます。

于 2013-05-22T13:07:11.203 に答える
6

これx3std::initializer_list<int>理解するための 1 つの方法は、次のようになります。

std::cout << typeid(x3).name() << std::endl ;

私にとっては、次の出力がありました。

St16initializer_listIiE

これを通すc++filt

c++filt -t St16initializer_listIiE

私に与えます:

std::initializer_list<int>
于 2013-05-22T13:08:46.180 に答える