Why are auto variables deduced to pointers when initialized by string literals?
auto, c++, c++11, string-literals, type-inference
Solution
The feature `auto` is based on template argument deduction and template argument deduction behaves the same, specifically according to §14.8.2.1/2 (C++11 standard):
- If P is not a reference type
- If A is an array type, the pointer type produced by the array-to-pointer conversion is used in place of A for type deduction
If you want the type of the expression `x` to be an array type, just add `&` after `auto`:
auto& x = "Hello world!";
Then, the `auto` placeholder will be deduced to be `const char[13]`. This is also similar to function templates taking a reference as parameter. Just to avoid any confusion: The declared type of x will be reference-to-array.
Problem
``` #include <iostream> #include <typeinfo> int main() { const char a[] = "hello world"; const char * p = "hello world"; auto x = "hello world"; if (typeid(x) == typeid(a)) std::cout << "It's an array!\n"; else if (typeid(x) == typeid(p)) std::cout << "It's a pointer!\n"; // this is printed else std::cout << "It's Superman!\n"; } ``` Why is `x` deduced to be a pointer when string literals are actually arrays? A narrow string literal has type "array of n `const char`" [2.14.5 String Literals [lex.string] §8]