template<typename T>
void print_size(const T& x)
{
std::cout << sizeof(x) << '\n';
}
int main()
{
print_size("If you timidly approach C++ as just a better C or as an object-oriented language, you are going to miss the point.");
// prints 115
}
To drukuje 115 na najnowszym kompilatorze g ++. Najwyraźniej, T
jest wydedukowana jako tablica (zamiast wskaźnika). Czy to zachowanie gwarantuje standard? Byłem trochę zaskoczony, ponieważ poniższy kod wypisuje rozmiar wskaźnika i myślałem, że auto
zachowuje się dokładnie tak samo jak odliczanie argumentów w szablonie?Odliczanie argumentów szablonowych dla literałów łańcuchowych
int main()
{
auto x = "If you timidly approach C++ as just a better C or as an object-oriented language, you are going to miss the point.";
print_size(x);
// prints 4
}
Nie teraz dla pierwszego, ale drugi nie jest nieoczekiwany. Literały łańcuchowe SĄ tablicami, prawda? – Tomek
Dla każdego, kto czyta to, kto nie wie: nie możesz przekazać tablic według wartości (rozpadają się na wskaźniki), ale na pewno możesz przekazać odwołanie do tablicy. W tym przypadku 'const T &' staje się odwołaniem do tablicy, więc 'sizeof' daje rozmiar tablicy. –
Odpowiedź Martinho obejmuje główne pytanie. Dla zachowania jest zagwarantowane, 14.8.2.1/2: "Jeśli' P' nie jest typem odniesienia: Jeśli 'A' jest typem tablicy, typ wskaźnika wytworzony przez konwersję standardową tablica-do-wskaźnika jest używany zamiast 'A' dla dedukcji typu; ..." gdzie 'P' jest typem parametru funkcyjnego funkcji szablonu, który może obejmować jeden lub więcej parametrów szablonu, a' A' jest typem wyrażenia używanego w wywołaniu funkcji. – aschepler