2016-10-17 18 views
2

以下のC++コードでは、タイプはaですか?あなたは自動初期化リストのタイプ

auto a = { "lol", "life" }; 

を持っている場合typeid戻りSt16initializer_listIPKcE

auto a = { "lol", "life" }; 
+3

どのような規格を使用していますか? 11,14,17? auto initializer_listは少し揮発性です... – DeiDei

+2

'const volatile auto a = {" trollin '"}}' –

答えて

5

は、コンパイラは型はすべての要素が何であるかであるstd::initializer_listを推測しようとします。この場合、"lol""life"は両方ともconst char[]なので、std::initializer_list<const char*>となります。

他にあなたが

auto foo = { 1, 2.0 }; 

のようなものを持っていた場合は要素の型が異なるため、その後は、コンパイルエラーを持っているでしょう。 1 expectionで次のように初期化子リストの自動控除のため

ルールである

auto x1 = { 1, 2 }; // decltype(x1) is std::initializer_list<int> 
auto x2 = { 1, 2.0 }; // error: cannot deduce element type 
auto x3{ 1, 2 }; // error: not a single element 
auto x4 = { 3 }; // decltype(x4) is std::initializer_list<int> 

expection前C++ 17

auto x5{ 3 }; 

std::intializer_list<int>あることがあるC++ 17ですでにルールを採用しているほとんどのコンパイラは、intと推測されています。

4

あなたの質問への答えはあなたがタイプの非マングルされた名前を知りたい場合は、未定義のテンプレートのトリックを使用することができますstd::intializer_list<char const*>

です:それ

auto a = { "", ""}; 
get_type_name(a); 
を呼び出す

template<typename T> 
void get_type_name(T&&); 

の行に沿って何かを示す読み取り可能なエラーメッセージが表示されます。 210
undefined reference to `void get_type_name<std::initializer_list<char const*>&>(std::initializer_list<char const*>&)' 
関連する問題