Я получаю неожиданные результаты от всех компиляторов, на которых я пробовал следующее (GCC 4.7.2, GCC 4.8.0 беты, ICC 13.0.1, Clang 3.2, VC10):Каков результат decltype («Привет»)?
#include <type_traits>
int main()
{
// This will fire
static_assert(
std::is_same<decltype("Hello"), char const[6]>::value,
"Error!"
);
}
Я бы иметь ожидал, что утверждение времени компиляции выше не, чтобы стрелять, но это так. В конце концов, это один не дает (как и ожидалось):
#include <type_traits>
int main()
{
char const hello[6] = "Hello";
// This will not fire
static_assert(
std::is_same<decltype(hello), char const[6]>::value,
"Error!"
);
}
Так что результат decltype("Hello")
в соответствии с C++ 11 Standard (ссылки высоко оценили)? Что я должен сравнивать с тем, чтобы не приводило к тому, что утверждение времени компиляции не срабатывает?
Эти правила имеют смысл, когда вы думаете о написании 'decltype (expr) &&'. –
@KerrekSB: Да. Я просто нашел это удивительным, потому что я как бы привык думать в грубых терминах «строковый литерал имеет тип' const char [] ',' decltype (x) 'возвращает тип' x', поэтому 'decltype (" hello ")' должен возвращать 'const char [6]' ", забывая детали. Выученный урок (надеюсь) –
+1 как на вопрос, так и на ответ. Я обещаю, что больше не буду использовать компилятор C++. – 2013-02-24 00:28:26