有什么区别:
const double& pi = 3.14;
和(没有&符号):
const double pi = 3.14;
他们似乎都有相同的L和R值,那么差异是什么?
答案 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);