为什么对易失性 int 的常量引用需要static_cast
Why does a const reference to volatile int need a static_cast?
给定以下代码:
struct Foo {
volatile int i;
};
const int& bar = foo.i;
我得到:
error: invalid initialization of reference of type 'const int&' from expression of type 'volatile int'
除非我提供一个static_cast<volatile int>
.
C++类型中的"波动性"的工作方式与"常量"几乎完全相同 - 也就是说,volatile
的对象不能分配给非volatile
引用,就像
const int i = 3;
int& j = i; // won't work
同样,只能在易失性对象上调用标记为 volatile
的方法:
struct S
{
void do_something() volatile {}
void do_something_else() {}
};
volatile S s;
s.do_something(); // fine
s.do_something_else(); // won't work
方法可以被"波动性"重载,就像它们可以被恒常性重载一样。
在C++标准中,这些东西被称为 cv 限定符,以强调它们以完全相同的方式工作。(C99 添加了第三个以相同方式工作的方式,restrict
,在某些C++编译器中可用作扩展)。您可以使用const_cast<>
更改 cv 限定符 - 不需要更强大的static_cast<>
。
编辑:
为了清楚起见,一个类型可以同时具有 const
和 volatile
修饰符,总共有四种可能性:
int i;
const int j;
volatile int k;
const volatile int l;
与const
一样,volatile
对象只能由volatile
引用引用。否则,编译器无法知道通过引用访问对象需要是可变的。
volatile const int& bar = foo.i;
^^^^^^^^
除非我提供
static_cast<volatile int>
通过添加强制转换来静默编译器错误很少是一个好主意。这不会给你一个对foo.i
的引用,而是给你一个单独的副本。
如果你正在做一些非常奇怪的事情,需要对易失性对象的非易失性引用,你需要const_cast
删除qualifer:
const int& weird = const_cast<int&>(foo.i);
相关文章:
- 如何理解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中,术语"一个可行函数"指的是什么