c++ - 原始引用之间的 static_cast

标签 c++ static-cast

是否使用 static_castconst 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)到一个临时的,或者如果它发生在运行时。所以是的,您应该从值中得到 1char 1 将被复制到 unsigned long long 中,const& 将绑定(bind)到它。我不认为它不会绑定(bind)到您创建的数组。这将是完全安全的,您可以忽略上面的大部分内容。

您可以通过尝试转换为左值来稍微测试一下这个想法。不过,您不必让数据成为 constexpr

http://ideone.com/TxYose

关于c++ - 原始引用之间的 static_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33619134/

相关文章:

C++ 生日概率

c++ - Mac 64 位系统调用

c++ - static_cast 到右值引用和 std::move 在初始化中更改它们的参数

c++ - 我应该在赋值和返回语句中使用 static_cast 吗?为什么?

c++ - 在将 void* 转换为任何内容时,我应该使用 static_cast 还是 reinterpret_cast

c++ - 尽管有切片,为什么 static_cast 仍然可以使用空指针?

c++ - Windows 共享内存和不同的编译器奇怪的行为

c++ - 数组还是 vector ?

c++ - 将真值表加载到二维 vector 中

c++ - C++中如何定义从整数到 float 的精度损失?