2011-09-19 19 views
7

Bjarne Stroustrup, GoogleTechTalks video on Youtube numaralı telefondan yaklaşan C++ 0x standardını anlatıyor.C++ 'müstehcen' anahtar kelimesinin kullanımının bu örneği doğru mu?

#include <iostream> 

struct Sick 
{ 
    Sick(double d)  { std::cout << d << "\n"; } 
    explicit Sick(int i) { std::cout << i << "\n"; } 
}; 


int main() 
{ 
    Sick s1 = 2.1; 
    Sick s2(2.1); 
} 

o belli bağlamlarda örtük dönüşüm ile ilişkili sorunları vurgulamak amacıyla, Sick(double) yerine Sick(int) önce explicit anahtar kelimeyi yerleştirmek için kastettiniz: videoda o aşağıdaki örneği bahseder? Onun tartışmada

+3

Youtube videosu içinde birinin ne anlama geldiğini nasıl bilmeliyiz? Önemli olan şudur: * bu örnekte 'açık' ifadesini kullanmanız *. –

+2

Örnekle göstermek istediğiniz şeye bağlı olarak makul olabilir. – Flexo

+3

@Kerrek SB, Ne demek istediğini bildiğinden, ne demek istediğini anlatmaya çalışıyor. – ikegami

cevap

9

, Stroustrup herhangi explicit kurucular varsa doğrudan bir başlatma,

Sick s2(2.1); 

gibi

sadece kurucular explicit işaretlenmiş ele alacağız bahseder. Bu benim pek çok derleyiciyle (GCC 4.6.1 ve MSVC 16/VS 2010 dahil) benim deneyimim değil ve standartta böyle bir gerekliliği bulamıyorum (birilerinin işaret edip etmemesi ilgimi çekiyor olsa da).

#include <iostream> 

struct Sick 
{ 
    Sick(double d)  { std::cout << "double " << d << "\n"; } 
    explicit Sick(int i) { std::cout << "int " << i << "\n"; } 
}; 


int main() 
{ 
    Sick s1 = 2; 
    Sick s2(2); 
} 

yukarıdaki irade ekran Running:

double 2 
int 2 

Şunu iki gösterir int başlatıcılar kullanılırsa

Ancak, ben örnek Stroustrup göstermek için ne anlama geldiğini göstermek düşünüyorum Görünüşe göre eşdeğer başlatmalar aslında farklı kurucular seçmektedir.

(Veya söz konusu sorudan bahsettiğimiz gibi - ve özledim - explicit anahtar sözcüğünün Sick(double d) yapıcısında olması gerekir).

İlgili konular