基元引用之间的static_cast
static_cast between primitive references
是否定义了使用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上编译时不会出现错误或警告。这实际上是安全的,还是不安全但不需要给出错误?
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
是非类类型,则会创建一个类型为cv1T1
的临时类型,并从初始值设定项表达式进行复制初始化。然后将引用绑定到临时。
- 如何理解C++标准N3337中的expr.const.cast子句8
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- C++Cast运算符过载
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- 收到错误"invalid use of non-static data member 'stu::n' "
- LNK1104:无法打开libpjproject-i386-Win32-vc14-Debug-Static.lib
- 我应该在 C++ 中何时/为什么使用 STATIC?
- 在VS2019项目中集成ImageMagick:x64-windows-static library
- 如何处理Boost Spirit X3导致Visual Studio 2019 "static initialization order fiasco"?
- "static char __ = []() -> char"的含义
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- 无法在 DLL 中链接 SDL2-static.lib
- 如何摆脱C++中未解析的外部符号"private: static char"错误?
- 错误:"cast"未命名类型void setCastDescription(std::string
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- C++线程"Call to non-static member function without an object argument"
- 出现这种错误的原因是什么"invalid use of non-static data member "
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- static是如何使用ClassA::m_variable处理所有类对象的
- 在[expr.static.cast]/4中,术语"一个可行函数"指的是什么