2012-11-09 18 views
6
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 
} 
+1

Şimdi için değil ama ikincisi beklenmedik değil. Dize değişmezleri diziler, değil mi? – Tomek

+2

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. –

+1

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

cevap

8

auto şablon argümanı indirimi gibi tam davranır. Tam olarak T! Bununla

template<typename T> 
void print_size(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 4 
    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 
} 

:

karşılaştırın

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 
    const 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 115 
} 

olarak değil, ama bu köşe vakaların biri değildir.

+0

Aptal beni. Perdeyi kaldırdığınız için teşekkürler :) – fredoverflow

+0

Elbette, C-stili bir diziyi C++ cinsinden bir değer olarak geçiremezsiniz. – Yakk

+0

@Yakk: Gerçekten de, bu C uyumluluğunu kırdığı için. C referansları yoktu, bu yüzden orada kırılacak herhangi bir davranış yoktu. – MSalters

İlgili konular