基元引用之间的static_cast

static_cast between primitive references

本文关键字:static cast 之间 引用      更新时间:2023-10-16

是否定义了使用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上编译时不会出现错误或警告。这实际上是安全的,还是不安全但不需要给出错误?

BONUS:我没想到arr[0]会是一个常量表达式,但使用value作为常量表达式不会出错。是因为arr是一个数组吗?

*它是未定义的,因为您通过引用另一个类型来使用一种类型。*您使用了强制转换,因此编译器应该信任您是否能够执行该强制转换。*它通常会以您所期望的方式工作,只是我怀疑在大多数架构上的价值是否真实

实际上,我认为这里发生的是const&您将强制转换为绑定到临时,或者如果它发生在运行时,则绑定到临时。所以,是的,你应该从这个值中得到1。将CCD_ 9 1复制到CCD_;将与此绑定。我想它不会绑定到你制作的数组。这将是完全安全的,你可以忽略上面的大部分内容。

您可以通过尝试转换为左值来测试这个想法。不过,您不必将数据设为constexpr

http://ideone.com/TxYose

我认为这已经被C++14:中的[expr.static.cast]/4覆盖了

对于某些发明的临时变量t,如果声明T t(e);格式良好,则表达式e可以使用形式为static_cast<T>(e)static_cast显式转换为类型T。这样的影响显式转换与执行声明和初始化,然后使用临时变量作为转换的结果相同。

这将您的代码定义为等效于:

constexpr unsigned char arr[sizeof(unsigned long long)]{ 1 };
const unsigned long long &t (arr[0]);
constexpr bool value = (t == 1);

第二行现在很熟悉了:在[dcl.init.ref]/5:下,允许从不同(与引用无关)类型的值初始化const引用

如果T1是非类类型,则会创建一个类型为cv1 T1的临时类型,并从初始值设定项表达式进行复制初始化。然后将引用绑定到临时。