C++标准中引用cv限定符增减规则的定义位置查询
C++引用的cv限定符规则标准依据
允许为引用添加cv限定符
如下代码合法,可为引用追加const/volatile限定符:
int main() { int i = 5; const volatile int & ri = i; }
该规则的标准依据是C++23 N4928的**§9.4.4 (5) [dcl.init.ref]**:
当用类型为
cv2 T的左值初始化cv1 T&类型的左值引用时,只要cv1是cv2的超集(即cv1包含cv2的所有限定符,还可额外添加更多),初始化就合法。这直接允许了给引用添加cv限定符的操作。
禁止移除引用的cv限定符
反过来,尝试移除原有对象的cv限定符来绑定引用会编译失败,示例:
int main() { const volatile int i = 5; int & ri = i; }
这条约束同样来自**§9.4.4 (5) [dcl.init.ref]**:
若引用类型的cv限定符集合是被初始化表达式类型cv限定符的子集(即试图移除原有的cv限定),这种隐式初始化是不被允许的——只有通过
const_cast显式转换才能绕过,但这属于不安全操作且不在隐式规则的允许范围内。
你之前在§6.8.5 (5) [basic.type.qualifier]中找到的"more cv-qualified"定义,是判断cv限定符集合包含关系的基础规则,而引用场景下的具体应用就集中在上述引用初始化的章节里。你搜索到的其他条款都是该定义在指针、模板重载决议等场景下的延伸,和引用的直接规则无关。
内容的提问来源于stack exchange,提问作者Thomas W.
相关产品推荐
相关产品推荐

