C ++ const引用和consts之间的区别?

时间:2010-10-13 21:03:39

标签: c++ reference const lvalue rvalue

有什么区别:

const double& pi = 3.14;

和(没有&符号):

const double pi = 3.14;

他们似乎都有相同的L和R值,那么差异是什么?

6 个答案:

答案 0 :(得分:7)

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

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

但是,由于第一个绑定对临时的引用,当类型为类类型时,临时可以是派生类,例如,由功能产生!然后它会在范围的最后调用它的析构函数。在ScopeGuard实现中使用了这个小小的el neato技巧(参见原始的ScopeGuard article in DDJ,Petru Marginean和Andrei Alexandrescu - Petru发明了ScopeGuard,Andrei在上面做了一个更普遍的事情。)

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

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

干杯&第h

答案 1 :(得分:1)

与引用的重要区别在于引用本身是继承不变的。一旦引用本身最初被赋值给变量,它就不能引用另一个变量。所有修改它的尝试都会修改它引用的变量。鉴于此,const将表示引用是对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.

答案 2 :(得分:1)

关于double的常量引用,引用和常量的一些说明。

参考

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

常量参考

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

常数是一个值,并且不会指向任何内容。

优化&取代

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:-3)

引用isnt const只有值是const,所以你应该可以重新分配referense,这意味着以下就可以了:

const double& pi = 3.14;
const double  pi2 = 2.78;
pi = *(&pi2);