简而言之,我问以下代码是否仅在
/* 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
。
调用函数本身并不是UB。如果您尝试修改其中一个成员的值或对象本身,则只有 UB。