通过 const 和

Writing to class member through const &

本文关键字:const 通过      更新时间:2023-10-16

在这个例子中,c样式是否强制转换为int&后跟一个赋值,以破解类的接口A未定义的行为?

class A
{
public:
A()
: x(0)
{
}
~A()
{
std::cout << x << std::endl;
}
const int& getX()
{
return x;
}
private:
int x;
};
int main()
{
A a;
int& x = (int&)a.getX();
x = 17;
std::cout << x << std::endl;
}

输出:

17
17

如果是这样,我可以参考标准的哪一部分?另外,有什么理由在没有警告的情况下编译吗?(我在 cpp.sh 上用 -Wall、-Wextra 和 -Wpedantiic 测试了 C++14)

const int& getX() { return x; }

由于此方法未标记为 const,因此 x 是一个可变的 int。在返回点获取引用并转换为 const int&。请注意,尽管引用的是常量 int,但实际的裁判 int 是可变的。这很重要。

int& x = (int&)a.getX();

此行采用返回的 const int 引用,并将其const_cast为 int 引用。这在 c++ 中是合法的,句号。[expr.const.cast]

但是,仅当被引用的原始对象是可变的时,通过此引用进行写入才是合法的。

在这种情况下,它是。

您可以在[dcl.type.cv]中找到详细信息