2016-12-22 4 views
2

Использование std::is_convertible:Когда std :: is_convertible считает примитивные типы конвертируемыми?

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 

я не мог получить, почему выход должен быть true для всех перечисленных выше случаях, когда они оказались в конвертируемый (конверсии типа, которые могут привести к потере точности) , Или мы не должны сравнивать примитивные типы, используя std::is_convertible?

+4

Но все они конвертируемые ... вы можете использовать 'int' для' char' или 'float' для' int', если хотите. Почему вы думаете, что не можете? – SirGuy

+0

Когда они конвертируемы. ;) –

+0

@SauravSahu Потому что он конвертируемый – SirGuy

ответ

6

страницы связаны состояния:

Если оператор возврата в воображаемом определении функции { return std::declval<From>(); } хорошо сформирован, (то есть, если std::declval<From>() может быть преобразованы используя неявное преобразование), обеспечивают постоянный член значение равно true.

Все типы указанных неявно конвертируемым (хотя компилятор может выдавать предупреждение), а именно:

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

совершенно законно и хорошо сформирован. Таким образом, std::is_convertible<float, int>::value будет правдой. То же самое справедливо и для оставшейся части перечисленных сравнений.

Смежные вопросы