std::is_convertible在什么情况下认为原始类型是可转换的?

3

使用 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
当它们可以转换时。 ;) - Edward Strange
@SauravSahu 因为它是可转换的。 - SirGuy
3
@GuyGreer - 对于这些转换,你不需要进行任何 强制转换(cast)操作,它们都可以隐式地完成。 - Pete Becker
3
给定代码 double d = 0; char c = d;,你的编译器是否会报错?如果会,错误信息是什么?如果不会,你认为为什么 double 不能转换为 char - user743382
1个回答

7
该页面说明:
如果虚构函数定义中的返回语句 { return std::declval<From>(); } 是良好形式(即,如果 std::declval<From>() 可以使用隐式转换进行转换),则提供与 true 相等的成员常量值。
所有提到的类型都可以隐式转换(尽管编译器可能会发出警告)。
float f = 0.8f
int i = f; // Legal implicit conversion.

这段代码是完全合法和良好的格式。因此,std::is_convertible<float, int>::value 将为true。同样也适用于其余列出的比较。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接