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

यह कोड gcc 4.8.0 के साथ संकलित नहीं करता है। मुझे decltype(x3) के प्रकार का अनुमान भी नहीं लगता है। यह क्या है? और व्यवहार अलग क्यों है?ऑटो को अलग-अलग क्यों निकाला जाता है?

+0

घोषणा त्रुटियों .... –

+0

@GrijeshChauhan आप अधिक विशिष्ट हो सकता है? – Sungmin

+5

'ऑटो एक्स {y}' एक 'std :: startizer_list' है। – Xeo

उत्तर

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

यह संकलित होगा।

Let प्रकार है कि एक चर पहचानकर्ता d के लिए निर्धारित किया गया है हो सकता है T: एक std::initializer_list<int> के कारण होने का निष्कर्ष निकाला गया है। टी से [P प्राप्त करें [...] यदि प्रारंभकर्ता एक ब्रेस्ड-इनिट-लिस्ट (8.5.4) है, std::initializer_list<U> के साथ।

+0

धन्यवाद। मुझे मिल गया :) – Sungmin

6

तो वास्तव में है एक std::initializer_list<int>, तो आप इस बाहर के रूप में किया जाएगा लगा करने के लिए एक ही रास्ता है इस प्रकार है:

St16initializer_listIiE 

लाना:

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

मेरे लिए मैं निम्नलिखित आउटपुट था यह c++filt के माध्यम से:

c++filt -t St16initializer_listIiE 

मुझे देता है:

std::initializer_list<int> 
+0

धन्यवाद, मुझे मिल गया :) – Sungmin

संबंधित मुद्दे