类成员引用变量是否有内置"const-correctness"?
Do class member reference variables have in-built "const-correctness"?
struct A {
int &r;
A (int &i) : r(i) {}
void foo () const {
r = 5; // <--- ok
}
};
编译器不会在 r = 5;
时生成任何错误。
这是否意味着&r
已经是常量正确的参考(逻辑等价于int* const
)?[这里有一个相关的问题。
我不确定你所说的"已经正确"到底是什么意思,但是:
分配给r
与分配给传递给A
构造函数的任何事物相同。执行此操作时,您不会修改A
实例中的任何内容,因此foo
被声明为 const 的事实不是障碍。这很像你已经这样做了:
struct A {
int * r;
A (int * i) : r(i) {}
void foo () const { *r = 5; }
}
foo
是 const 的事实意味着它不会修改调用它A
实例中的任何内容。这和让它修改它提供的其他数据之间没有冲突。
当然,如果您碰巧安排r
引用A
的某个成员,那么调用foo
毕竟会修改A
的实例。编译器无法捕获可能违反成员函数const
性的所有可能方式;当你声明一个成员函数时const
你承诺它不会参与任何这样的诡计。
是的,它在逻辑上等同于 int* const
.
在这种情况下,您可能希望创建和使用适当限定的访问器,以防止对引用r
值进行不必要的更改。
我将const
成员函数解释为隐式插入const
到每个还没有此类限定符的数据成员的左侧。该const
已经隐式存在以供引用(int & const r;
是非法语法)。换句话说,引用是"已经正确"的,可以使用您的命名法。
如果成员函数上的const
限定符具有在每个数据成员的每个可能的有效位置插入const
的影响(例如,数据成员int ** foo;
的行为类似于const
成员函数中的int const * const * const foo;
),那就太好了,但这不是发生的事情,也不是标准所说的会发生。
相关文章:
- 内置函数可查看CPP中的成员变量
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- 按字母顺序对字符串中的字母进行排序,而无需使用内置的 sort()
- 将字符串转换为浮点数或整数,而无需使用内置函数(如 atoi 或 atof)
- 如何从 c++ 中类中内置的数组继承
- 如何捕获 C++ 内置异常对象
- macOS 是内置在 clang 编译器中还是内置于 xcode ide 中?
- 将编译器开关添加到 Eclipse CDT 内置编译器设置生成?
- gcc Atomic在gcc 4.1.1中内置了奇怪的行为
- 是否有用于元素部分移位的 simd 指令/内在/内置指令?
- 何时包含内置类型和运算符的标头?
- 基本类型与内置类型有什么区别C++
- 指内置类型的文字
- GLUT 问题:重新声明 c++ 内置类型'wchar_t'时出错
- const(但不是constexpr)用作内置数组大小
- 在C++标准中哪里说必须初始化 const 内置类型变量的定义
- 内置类型的返回const值
- 是在c++中内联的const内置类型
- 类成员引用变量是否有内置"const-correctness"?
- 在 C++ 中从 const 用户定义类转换为内置类型