有什么区别:
const double& pi = 3.14;
和(没有&符号):
const double pi = 3.14;
它们似乎都具有相同的 L 和 R 值,那么有什么区别?
对于您的特定示例,没有区别。
这意味着,无论如何都无法区分它们。
然而,由于第一个绑定到一个临时的引用,当类型是类类型时,临时可以是一个派生类,例如由一个函数产生!然后在作用域的末尾正确调用它的析构函数。这个小技巧在 ScopeGuard 实现中使用(参见DDJ 中的原始 ScopeGuard 文章,由 Petru Marginean 和 Andrei Alexandrescu 撰写——Petru 发明了 ScopeGuard 并且 Andrei 在上面做了一个更通用的东西)。
我曾经问过创建 C++ 语言的 Bjarne Stroustrup,为什么支持您的第一个声明中的语法。
他的回答是,主要是要有统一的规则(即不对本地引用做任何特殊例外,而不是作为形式参数的引用)。我想当时我们都不熟悉 ScopeGuard。回想起来很简单,但需要像 Petru 或 Andrei 那样的头脑才能想出这样的东西!:-)
干杯&hth。
与引用的重要区别在于引用本身是继承不变的。一旦引用本身最初被分配给一个变量,它就不能再引用另一个变量。所有修改它的尝试都会修改它引用的变量。鉴于此,这const
将意味着引用是对 a 的引用const int
。
const int A;
const int B;
const int& Reference = A;
Reference = B; // Error, the value of A can not be assigned, nor would this *ever* be able to make Reference refer to B.
您还可以测试这个关于引用本身恒定的理论,如下所示:
const int& const Reference; // Should give a warning about the second const being redundant.
关于double
s 的常量引用、引用和常量的一点说明。
引用是指现有的对象,不能重新安装。 也就是说,一旦您声明(定义)引用,它将始终引用该项目。
C++ 语言允许声明一个常量引用。这告诉编译器引用不会改变。这可能是多余的,因为无法重新定位引用。但是,语言语法允许它。
常量是一个值,不引用任何东西。
允许编译器用相应的对象、常量或字面量替换(替换)对对象、常量或字面量的引用,前提是编译器可以保证在其使用的范围内不对该对象执行写操作。当引用传递给该范围内的方法或函数时,此确定可能会变得困难。
为引用指定const
修饰符将使编译器的工作更易于优化。常量引用是与程序员和用户签订的不会更改引用的合同。
const double& 是对常量 double 的引用,另一个是对常量 double 的引用。引用是一种 const 指针,是一个永远不会改变的指针。
在 C++ 中,引用本质上是 const。一旦它们被分配,您就无法更改它们。它们必须被声明和初始化。
引用不是 const 只有值是 const,所以你应该能够重新分配引用,这意味着以下是可以的:
const double& pi = 3.14;
const double pi2 = 2.78;
pi = *(&pi2);