2013-05-22 6 views
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. 
} 

Diese Codes werden nicht mit gcc 4.8.0 kompiliert. Ich rate nicht einmal den Typ decltype(x3). Was ist es? Und warum ist das Verhalten anders?Warum wird Auto anders abgeleitet?

+0

Erklärung Fehler .... –

+0

@GrijeshChauhan Sie spezifischer sein könnte? – Sungmin

+5

'auto x {y}' ist eine 'std :: initializer_list'. – Xeo

Antwort

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"); 
} 

Dies wird kompilieren.

Let T sein der Typ, der d für eine variable Kennung bestimmt wurde: ist ein std::initializer_list<int> aufgrund sein abgeleitet. Erhalten Sie P von T, [...] wenn der Initialisierer eine Klammer-Init-Liste (8.5.4) mit std::initializer_list<U> ist.

+0

Danke. Ich habe es :) – Sungmin

6

So ist eigentlich eine std::initializer_list<int>, eine Möglichkeit für Sie, diese herausgefunden haben, wäre wie folgt:

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

für mich ich die folgende Ausgabe hatte:

St16initializer_listIiE 

Einlochen dies durch c++filt:

c++filt -t St16initializer_listIiE 
Gibt

mich:

std::initializer_list<int> 
+0

Danke, ich habe es :) – Sungmin

Verwandte Themen