下面是const_cast未定义行为的用法
Is the following use of const_cast undefined behavior?
这是一个关于语言律师的问题,而不是一个很好的练习问题。
以下代码是有效的还是未定义的行为?const对象最终调用非const函数,但它实际上并不修改对象的状态。
struct Bob
{
Bob() : a(0) {}
int& GetA()
{
return a;
}
const int& GetA() const
{
return const_cast<Bob&>(*this).GetA();
}
int a;
};
int main()
{
const Bob b;
int a = b.GetA();
}
行为定义良好:
c++标准,第5.2.11/7节[const cast]
注意:根据对象类型的不同,通过指向数据成员的指针、左值或指针进行的写操作可能会产生未定义的行为。-end note]
GetA()
不写入Bob
的任何成员,因此该程序不涉及未定义行为。
我相信它是定义良好的,因为标准只将未定义的行为归因于修改 const
对象。c++ 11后面跟着引号:
[expr.const。铸造]5.2.11§7
[注:根据对象的类型,可通过指针、左值或指针进行写操作去掉常量限定符的
const_cast
所产生的数据成员可能产生undefined行为(7.1.6.1)。 -end note]
[dcl.type。Cv] 7.1.6.1§4
除了可以修改任何声明为
mutable
(7.1.1)的类成员,任何修改const
的尝试对象的生命周期(3.8)导致未定义行为. ...
GetA()
实际上没有修改任何对象,所以它没有未定义的行为。
相关文章:
- 编译C++时未定义的引用
- vscode g++链路故障:体系结构x86_64的未定义符号
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 不知道某个东西是否被忽略会引入未定义的行为吗
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 未定义的引用在哪里
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- c++11评估顺序(未定义的行为)
- 使用mysql c++连接器的未定义引用
- 从python调用openMP共享库时,未定义opnMP函数
- 在 Mac 上使用 CMAKE 将 FFTW 和 FFTWPP 链接到项目中时未定义的符号
- Cmake 链接问题:未定义对 Button::mousePressEvent(QGraphicsSceneMouseE
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- 具有外部"c"和程序集的未定义函数
- 此增量后语句是否会导致未定义的行为?
- 尝试调用 .h 文件中定义的变量时出现变量未定义错误
- 为什么 setjmp/longjmp 的这种用法是未定义的行为?
- 简单的类用法+未定义的引用