2016-12-22 2 views
2

Mit std::is_convertible:Wann ist std :: is_convertible primitive Typen konvertierbar?

bool i2c = std::is_convertible<int, char>::value; 
bool c2i = std::is_convertible<char, int>::value; 
bool f2i = std::is_convertible<float, int>::value; 

std::cout << std::boolalpha; 
std::cout << i2c << '\n'; //prints true 
std::cout << c2i << '\n'; //prints true 
std::cout << f2i << '\n'; //prints true 

Ich konnte nicht bekommen, warum die Ausgabe true für alle oben genannten Fälle sein musste, wenn sie in wandelbare (Typkonvertierungen, die Genauigkeitsverlust führen kann) zu sein schien . Oder sollen wir die primitiven Typen nicht mit std::is_convertible vergleichen?

+4

Aber sie sind alle konvertierbar ... Sie können ein 'int' in ein' char' oder ein 'float' in ein' int' umwandeln, wenn Sie möchten. Warum denkst du, kannst du nicht? – SirGuy

+0

Wenn sie umwandelbar sind. ;) –

+0

@SauravSahu Weil es konvertierbar ist – SirGuy

Antwort

6

Die Seite verlinkt Zustände:

Wenn die Return-Anweisung in der imaginären Funktionsdefinition { return std::declval<From>(); } wohlgeformt ist, (das heißt, wenn std::declval<From>()mit impliziter Umwandlung umgewandelt werden kann), stellen das konstante Mitglied Wert gleich wahr.

Alle genannten Typen sind implizit konvertierbar (obwohl der Compiler eine Warnung ausgeben kann), das heißt:

float f = 0.8f 
int i = f; // Legal implicit conversion. 

vollkommen legal ist und gut geformt. So wird std::is_convertible<float, int>::value wahr sein. Das gleiche gilt für den Rest der aufgeführten Vergleiche.

Verwandte Themen