通过 const 和
Writing to class member through const &
在这个例子中,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]中找到详细信息
相关文章:
- 在 const 函数中通过引用和指针返回之间的区别
- 为什么通过指针编译时不能分配 const 初始化
- 在 C++ 中通过引用传递类成员时,Const 不起作用
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- C++ 为什么const X&可以通过功能进行修改?
- 正在通过const-ref未定义的行为捕获新构造的对象
- C++通过 const 引用传递时不调用派生类函数
- 如何通过头文件中的函数初始化 const int 数组?
- 通过与现有 QHash 连接来初始化 const QHash
- 为什么相同的函数签名只有区别,另一个通过 const 获取参数是重新定义?
- 通过 constexpr 中的 'const char *' glvalue 访问字符串文字的值会出错
- 正确的方法通过巨大的const对象的向量
- 通过std :: vector作为const float *
- const TYPE&- 我什么时候想通过引用 const 来使用?
- 通过移动分配从算术运算符过载中返回const值
- 通过 const 和
- 每当传递lvalue时,每当通过rvalue传递时,将const引用存储
- 通过const Rerefence传递向量并将元素添加到向量
- 通过参考const成员通过参考时,尝试引用已删除的函数
- C 通过引用传递const bool