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
}
Bu, son g ++ derleyicide 115 yazdırır. Görünüşe göre, T
bir dizi (bir işaretçi yerine) olduğu sonucuna varılır. Bu davranış standart tarafından garanti ediliyor mu? Biraz şaşırdım çünkü aşağıdaki kod bir işaretçinin boyutunu yazdırıyor ve ben de auto
şablon argümanı indirimi gibi davranıyor diye düşündüm.Dize değişmezleri için şablon bağımsız deyimi indirimi
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
}
Şimdi için değil ama ikincisi beklenmedik değil. Dize değişmezleri diziler, değil mi? – Tomek
Bilmeyenler bunu okuyanlar için: dizileri değere göre aktaramazsınız (işaretçilerle bozulurlar) ancak bir diziye referans gönderebildiğinden emin olabilirsiniz. Burada, const T & 'bir diziye referans olur ve bu yüzden' sizeof' dizinin boyutunu verir. –
Martinho'nun cevabı ana soruyu kapsar. Çünkü 14.8.2.1/2 garantili davranış: "P" bir referans tipi değilse: Eğer A 'bir dizi tipi ise, dizi-gösterici standart dönüşüm tarafından üretilen işaretçi türü yerine kullanılır. '' 'Türden kesinti için; ... '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' bir şablon işlevinin bir veya daha fazla şablon parametresi içerebilen işlev parametresi türüdür ve 'A' işlev çağrısında kullanılan ifadenin türüdür. – aschepler