Вопрос: какой тип у строкового литерала "Hello, world!"?
Ответ: его тип это const char[13]
Вопрос: что выведет decltype("Hello, world!")?
Ответ: поскольку массив это lvalue, будет выведено const char (&) [13]
Вопрос: что вернёт sizeof("Hello, world!")?
Ответ: sizeof("Hello, world!") == 14
А теперь философский вопрос: почему это так -- там 13 а там 14?
Нет, серьёзно. Дополнительный implicit нулевой завершающий символ влияет на sizeof, ок, так и сделали бы выведенный тип тоже шириной 14. Я погуглил ответ, но как-то никак. Я уверен, что это сделано for a reason, чтобы в языке что-нибудь такое важное срослось. Но что?
Спросил бы на stackoverflow, но вопрос получится "слишком общий" по тамошним правилам.
Здравствуйте, Tilir, Вы писали:
T>Вопрос: что выведет decltype("Hello, world!")? T>Ответ: поскольку массив это lvalue, будет выведено const char (&) [13]
Здравствуйте, Tilir, Вы писали:
T>А теперь философский вопрос: почему это так -- там 13 а там 14?
template<class T>
class view;
view<decltype("Hello, world!")> d;
Ошибки компиляции:
VC: error C2079: 'd' uses undefined class 'view<const char (&)[14]>'
GCC: error: aggregate ‘view<const char (&)[14]> d’ has incomplete type and cannot be defined
CLANG: error : implicit instantiation of undefined template 'view<char const (&)[14]>'