如您所知,引用无法重新分配,因为它们始终引用同一个对象,因此始终是常量。但是,C++ 语法允许永久链接:
int var = 33;
int const & r1 = var; // ссылка на константу
int & const r2 = var; // постоянная ссылка
r1
在引用常量的情况下,一切都非常明显。如果参数“通过引用”传递给函数,则可以使用const修饰符来防止在编写程序代码时意外更改该值。
r2
但是显式指定引用的持久性有什么意义呢?
我不清楚它可以在实践中应用到哪里。
ideone 上的 GCC (gcc-5.1)不会编译您的代码:
Visual Studio 2015 编译时给出警告:
当前标准 8.3.2/1(顺便说一下,链接在这里)是这样说的:
因此
const,引用链接要么无效,要么将被忽略。您的问题似乎建立在隐含的假设之上,即从语言语法的角度来看,这种结构的可接受性在某种程度上暗示了它的“必要性”或“意义”。
这是一个不正确的假设。
一个称职的语言设计只需要在正式句法(即语法)和单独描述的附加规则之间选择合理的职责分配,“用文字”。完全在语言语法层面实施各种此类限制的尝试将导致极其复杂的语法。在这种情况下,很明显,决定不尝试在语法级别实施此限制。
C 和 C++ 语言的规范包含大量此类情况的示例,在这些情况下,可以归类为纯句法(可能有一定延伸)的限制仍然不是在语言语法级别实现的,而是以单独描述的限制的形式。
例如,C 语言(以及直到最近的 C++)禁止在常量表达式中使用逗号运算符。然而,尽管这些语言的语法对“常量表达式”有单独的非终结符号,但这种禁令只针对顶级“逗号”在语法层面实施。而禁止使用更深层次的“逗号”(括号内)并没有体现在语法中,而是在语言规范中“in words”中制定了,因为构建一个完全独立的常量子语法太浪费了表达式。