在我正在编写的程序中出现了以下模式.我希望它不是太做作,但它设法Foo在const方法中改变一个对象Foo::Questionable() const,而不使用任何const_cast或类似的东西.基本上,Foo存储参考FooOwner,反之亦然,并在Questionable(),Foo设法修改本身在一个const方法通过调用mutate_foo()关于它的主人.问题遵循代码.
#include "stdafx.h"
#include <iostream>
using namespace std;
class FooOwner;
class Foo {
FooOwner& owner;
int data;
public:
Foo(FooOwner& owner_, int data_)
: owner(owner_),
data(data_)
{
}
void SetData(int data_)
{
data = data_;
}
int Questionable() const; // defined after FooOwner
};
class FooOwner {
Foo* pFoo;
public:
FooOwner()
: pFoo(NULL)
{}
void own(Foo& foo)
{
pFoo = &foo;
}
void mutate_foo()
{
if …Run Code Online (Sandbox Code Playgroud) $ 5.2.11/7 - "[注意:根据对象的类型,通过指针,左值或指向数据成员的指针进行写入操作会导致const-qualifier68的const_cast)可能会产生未定义的行为(7.1. 5.1).]"
本节的措辞(C++ 03)对我来说是令人惊讶的.令人惊讶的是两件事.
a)首先,使用'可能'.为什么'可能'?标准中的其他地方对未定义的行为非常明确
b)为什么抛弃原始const对象的常量而不是直接'未定义的行为'.为什么要触发UB需要写入?