是否使用 static_cast
将 const unsigned char&
转换为 const unsigned long long&
已定义?
constexpr unsigned char arr[sizeof(unsigned long long)]{ 1 };
constexpr bool value = static_cast<const unsigned long long&>(arr[0]) == 1;
放入 int main(){}
,这在 Coliru、Ideone 和 VS2015 上编译时没有错误或警告。这实际上是安全的,还是不安全但不需要报错?
奖励:我没想到 arr[0]
会是常量表达式,但是使用 value
作为常量表达式可以正常工作。是因为arr
是数组吗?
最佳答案
* 它是未定义的,因为您正在通过对另一种类型的引用来使用一种类型。
* 您使用了强制转换,因此如果编译器可以执行该强制转换,它应该信任您。
* 它通常会按照您似乎期望的方式工作,除了我怀疑大多数架构上的值(value)是否真实。
实际上我认为这里发生的是你转换到的 const& 被绑定(bind)到一个临时的,或者如果它发生在运行时。所以是的,您应该从值中得到 1
。 char
1 将被复制到 unsigned long long
中,const& 将绑定(bind)到它。我不认为它不会绑定(bind)到您创建的数组。这将是完全安全的,您可以忽略上面的大部分内容。
您可以通过尝试转换为左值来稍微测试一下这个想法。不过,您不必让数据成为 constexpr
。
关于c++ - 原始引用之间的 static_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33619134/