Ich erhalte unerwartete Ergebnisse aus allen Compilern, auf denen habe ich versucht, die folgende (GCC 4.7.2, 4.8.0 GCC beta, 13.0.1 ICC, Clang 3.2, VC10):Was ist das Ergebnis von decltype ("Hallo")?
#include <type_traits>
int main()
{
// This will fire
static_assert(
std::is_same<decltype("Hello"), char const[6]>::value,
"Error!"
);
}
Ich hätte erwartet die Kompilierung Assertion über nicht zu feuern, aber es tut. Schließlich hat dieser nicht (wie erwartet):
#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!"
);
}
Also, was ist das Ergebnis decltype("Hello")
nach dem C++ 11 Standard (Referenzen sehr geschätzt werden)? Was soll ich damit vergleichen, damit die obige Assertion zur Kompilierungszeit nicht ausgelöst wird?
Diese Regeln machen Sinn, wenn Sie über 'declltype (expr) &&' schreiben. –
@KerrekSB: Ja. Ich fand es einfach überraschend, weil ich irgendwie gewohnt bin, grob zu denken "ein String-Literal hat den Typ" const char [] ',' declltype (x) 'gibt den Typ von' x' zurück, also 'declltype (" hallo ")' sollte 'const char [6]' "zurückgeben und dabei die Details vergessen. Lektion gelernt (hoffentlich) –
+1 sowohl auf die Frage und die Antwort. Ich verspreche, dass ich nie mehr einen C++ - Compiler anfasse. –