是否调用非常量内存。乐趣。通过 const_cast 获得的非 const ref 在 const 对象上,仅当 fun 实际修改对象时才调用 UB?

问题描述 投票:0回答:1

简而言之,我问以下代码是否仅在

/* body */
确实更改了
i
的值时才调用 UB,或者如果没有,则通过调用非
const
maybeChange
const
对象上的成员函数。

// header.hpp
struct Foo {
  int i;
  void maybeChange();
};

void work(Foo const& foo);
// foo.cpp
#include "header.hpp"
void Foo::maybeChange() {
  /* body */
}
// work.cpp
#include "header.hpp"
void work(Foo const& foo) {
  const_cast<Foo&>(foo).maybeChange();
}
// main.cpp
#include "header.hpp"
Foo const foo{6};

int main() {
  work(foo);
}

我确实看到,如果修改真的发生,问题就存在,因为这违反了编译器可以做出的合法假设,即

foo
全局对象不会改变。

但另一方面,http://eel.is/c++draft/dcl.type.cv#4没有显示在

const
对象上调用非
const
成员函数的示例,其中
const 
const_cast
删除了,但这实际上并没有修改它,就像我上面的例子一样。它显示了一些简单的例子,例如

const int* ciq = new const int (3);     // initialized as required
int* iq = const_cast<int*>(ciq);        // cast required
*iq = 4;                                // undefined behavior: modifies a const object

最后一行确实修改了对象

*ciq

c++ language-lawyer undefined-behavior const-cast
1个回答
0
投票

调用函数本身并不是UB。如果您尝试修改其中一个成员的值或对象本身,则只有 UB。

© www.soinside.com 2019 - 2024. All rights reserved.