1

有什么区别:

const double& pi = 3.14;

和(没有&符号):

const double pi = 3.14;

它们似乎都具有相同的 L 和 R 值,那么有什么区别?

4

6 回答 6

7

对于您的特定示例,没有区别。

这意味着,无论如何都无法区分它们。

然而,由于第一个绑定到一个临时的引用,当类型是类类型时,临时可以是一个派生类,例如由一个函数产生!然后在作用域的末尾正确调用它的析构函数。这个小技巧在 ScopeGuard 实现中使用(参见DDJ 中的原始 ScopeGuard 文章,由 Petru Marginean 和 Andrei Alexandrescu 撰写——Petru 发明了 ScopeGuard 并且 Andrei 在上面做了一个更通用的东西)。

我曾经问过创建 C++ 语言的 Bjarne Stroustrup,为什么支持您的第一个声明中的语法。

他的回答是,主要是要有统一的规则(即不对本地引用做任何特殊例外,而不是作为形式参数的引用)。我想当时我们都不熟悉 ScopeGuard。回想起来很简单,但需要像 Petru 或 Andrei 那样的头脑才能想出这样的东西!:-)

干杯&hth。

于 2010-10-13T21:25:25.243 回答
1

与引用的重要区别在于引用本身是继承不变的。一旦引用本身最初被分配给一个变量,它就不能再引用另一个变量。所有修改它的尝试都会修改它引用的变量。鉴于此,这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.
于 2010-10-13T21:26:38.737 回答
1

关于doubles 的常量引用、引用和常量的一点说明。

参考

引用是指现有的对象,不能重新安装 也就是说,一旦您声明(定义)引用,它将始终引用该项目。

常数参考

C++ 语言允许声明一个常量引用。这告诉编译器引用不会改变。这可能是多余的,因为无法重新定位引用。但是,语言语法允许它。

持续的

常量是一个值,不引用任何东西。

优化和替换

允许编译器用相应的对象、常量或字面量替换(替换)对对象、常量或字面量的引用,前提是编译器可以保证在其使用的范围内不对该对象执行写操作。当引用传递给该范围内的方法或函数时,此确定可能会变得困难。

为引用指定const修饰符将使编译器的工作更易于优化。常量引用是与程序员和用户签订的不会更改引用的合同。

于 2010-10-13T21:35:01.070 回答
0

const double& 是对常量 double 的引用,另一个是对常量 double 的引用。引用是一种 const 指针,是一个永远不会改变的指针。

于 2010-10-13T21:09:00.197 回答
0

在 C++ 中,引用本质上是 const。一旦它们被分配,您就无法更改它们。它们必须被声明和初始化。

于 2016-05-02T12:46:55.907 回答
-3

引用不是 const 只有值是 const,所以你应该能够重新分配引用,这意味着以下是可以的:

const double& pi = 3.14;
const double  pi2 = 2.78;
pi = *(&pi2);
于 2010-10-13T21:16:44.953 回答