原始引用之间的static_cast

时间:2015-11-09 22:05:03

标签: 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上编译时没有错误或警告。这实际上是安全的,还是不安全但不要求出错?

BONUS:我并不期望arr[0]是一个常量表达式,但使用value作为常量表达式可以正常工作。是因为arr是一个数组吗?

2 个答案:

答案 0 :(得分:2)

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

实际上我认为这里发生的是const&amp; amp;你被施放到一个临时的,或者如果它发生在运行时。所以是的,你应该从价值中得到$(document).ready(function (){ $('.nav-btn').on("click", function() { $('.hamburger').slideToggle("slow"); }); }); 1 1将被复制到char和const&amp;将绑定到那。它不会与你所创造的阵列绑定,我不会想到。这将是完全安全的,您可以忽略上述大部分内容。

你可以通过尝试转换为左值来测试这个想法。您不得不将数据设为unsigned long long

http://ideone.com/TxYose

答案 1 :(得分:1)

我认为C ++ 14中的[expr.static.cast] / 4涵盖了这一点:

  

如果声明e格式正确,则可以使用T形式的static_cast将表达式static_cast<T>(e)显式转换为T t(e);类型,对于一些发明的临时变量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 ,并从初始化表达式中复制初始化。然后将引用绑定到临时。