Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ const引用与const的区别?_C++_Reference_Constants_Lvalue_Rvalue - Fatal编程技术网

C++ const引用与const的区别?

C++ const引用与const的区别?,c++,reference,constants,lvalue,rvalue,C++,Reference,Constants,Lvalue,Rvalue,以下两者之间的区别是什么: const double& pi = 3.14; 没有符号: const double pi = 3.14; 它们似乎都有相同的L和R值,那么区别是什么呢?常数double&是对常数double的引用,另一个是常数double。引用是一种常量指针,一种永不改变的指针。constdouble&是对常数double的引用,另一个是常数double。引用是一种常量指针,一种永远不会改变的指针。引用不是常量,只是值是常量,因此您应该能够重新分配引用,这意味着以下各

以下两者之间的区别是什么:

const double& pi = 3.14;
没有符号:

const double pi = 3.14;

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

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

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

引用不是常量,只是值是常量,因此您应该能够重新分配引用,这意味着以下各项可以:

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

引用不是常量,仅值是常量,因此您应该能够重新分配引用,这意味着以下各项可以:

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

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


这意味着,无论如何,没有办法区分它们

但是,由于第一个将引用绑定到临时类,因此当类型为类类型时,临时类可以是派生类,例如,由函数生成!然后在作用域的末尾正确调用其析构函数。这个小小的el neato技巧被用于ScopeGuard的实现中。参见Petru Marginean和Andrei Alexandrescu的原著——Petru发明了ScopeGuard,Andrei在上面做了一个更一般的东西

我曾经问过Bjarne Stroustrup,他创建了C++语言,为什么支持第一个声明中的语法。 他的回答是,主要是要有统一的规则,也就是说,对于本地引用,相对于作为形式参数的引用,不做任何特殊的例外。我想当时我们两人都不熟悉这个地方。回想起来,这很简单,但需要像佩特罗或安德烈那样的头脑,才能想出这样的想法!:-


干杯&hth.

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


这意味着,无论如何,没有办法区分它们

但是,由于第一个将引用绑定到临时类,因此当类型为类类型时,临时类可以是派生类,例如,由函数生成!然后在作用域的末尾正确调用其析构函数。这个小小的el neato技巧被用于ScopeGuard的实现中。参见Petru Marginean和Andrei Alexandrescu的原著——Petru发明了ScopeGuard,Andrei在上面做了一个更一般的东西

我曾经问过Bjarne Stroustrup,他创建了C++语言,为什么支持第一个声明中的语法。 他的回答是,主要是要有统一的规则,也就是说,对于本地引用,相对于作为形式参数的引用,不做任何特殊的例外。我想当时我们两人都不熟悉这个地方。回想起来,这很简单,但需要像佩特罗或安德烈那样的头脑,才能想出这样的想法!:-


干杯。

引用的重要区别在于引用本身是继承不变的。一旦引用本身最初分配给一个变量,它就不能引用另一个变量。所有修改它的尝试都将修改它引用的变量。鉴于此,const将意味着引用是对const int的引用

您还可以测试关于引用本身为常量的理论,如下所示:

const int& const Reference; // Should give a warning about the second const being redundant.

与引用的重要区别在于引用本身是继承不变的。一旦引用本身最初分配给一个变量,它就不能引用另一个变量。所有修改它的尝试都将修改它引用的变量。鉴于此,const将意味着引用是对const int的引用

您还可以测试关于引用本身为常量的理论,如下所示:

const int& const Reference; // Should give a warning about the second const being redundant.

关于常数引用、双精度引用和常数的一些澄清

参考 引用引用了现有对象,因此无法重置。也就是说,一旦声明并定义引用,它将始终引用该项

恒定参考

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

常数 常量是一个值,不引用任何内容

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

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

关于常数引用、双精度引用和常数的一点说明

参考 引用引用了现有对象,因此无法重置。也就是说,一旦声明并定义引用,它将始终引用该项

恒定参考

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

常数 常量是一个值,不引用任何内容

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



将常量修饰符指定给引用将使编译器的工作更易于优化。常数引用是程序员和用户的一个契约,它不会改变引用。C++中的引用引用是固有的const。一旦分配了它们,您就无法更改它们。它们必须同时声明和初始化。C++中的< /P> < P>引用是固有的const。一旦分配了它们,您就无法更改它们。它们必须同时声明和初始化。

你知道非引用和引用之间的区别吗?是的,我理解非常量变量和引用之间的区别,只是当它们是常量时,它们似乎有相同的行为。当它们是常量时,有没有办法区分它们?常量没有区别,引用与非引用的行为不同。也许在这种情况下,但你肯定会在其他情况下使用它们吗?是的,我刚才说的是在这个特殊情况下使用const。我知道非常量时引用与非引用完全不同,但创建常量引用时,它的关联值无法更改,这似乎与使用非引用变量没有什么不同。你知道非引用和引用之间的区别吗?是的,我理解非常量变量和引用之间的区别,只是当它们是常量时,它们似乎具有相同的行为。当它们是常量时,有没有办法区分它们?常量没有区别,引用与非引用的行为不同。也许在这种情况下,但你肯定会在其他情况下使用它们吗?是的,我刚才说的是在这个特殊情况下使用const。我知道非常量时引用与非引用完全不同,但创建常量引用时,其关联值无法更改,这似乎与使用非引用变量没有什么不同。是的,但它们在功能上有什么不同吗?也就是说,对于非常量,您可以区分int&和int值,但有可能区分常量int&和常量int吗?它们在功能或性能方面有过不同的表现吗?关于通过值传递的性能,当传递大对象时,这是非常昂贵的,这就是为什么您需要引用。关于常量int,在传递给函数时没有真正的理由使用引用,有时int更小。从功能上来说,一个引用不是一个实际的int,它是对另一个int的引用。但是你可以用类似的方法来使用它们。是的,但是它们在功能上有什么不同吗?也就是说,对于非常量,您可以区分int&和int值,但有可能区分常量int&和常量int吗?它们在功能或性能方面有过不同的表现吗?关于通过值传递的性能,当传递大对象时,这是非常昂贵的,这就是为什么您需要引用。关于常量int,在传递给函数时没有真正的理由使用引用,有时int更小。从功能上讲,一个引用不是一个实际的int,它是对另一个int的引用。但是你可以用类似的方法来使用它们。无法重置引用。这试图为常量变量赋值,但格式不正确。可能是这样的:pi=*&pi2@阿德西特:什么?这会有什么不同?*&取消。你不能重新放置引用,也不能赋值给常量变量。我不想赋值变量,而是重新赋值一个引用。我承认,这只是一个快速猜测。我没有编译。无法重新分配引用。它本质上是恒定的。一旦分配,就不能重新分配。此外,获取pi2的地址然后取消引用也没有意义。我甚至不确定您是否可以初始化对文本的引用,因为该文本不是变量。无法重置引用。这试图为常量变量赋值,但格式不正确。可能是这样的:pi=*&pi2@阿德西特:什么?这会有什么不同?*&取消。你
无法重置引用,无法分配给常量变量。我不想分配变量,但要重新分配引用。我承认,这只是一个快速猜测。我没有编译。无法重新分配引用。它本质上是恒定的。一旦分配,就不能重新分配。此外,获取pi2的地址然后取消引用也没有意义。我甚至不确定您是否可以初始化对文字的引用,因为文字不是变量。回答得很好。我只是想问,在什么意义上第一个是暂时的,这到底意味着什么?它与第二个有什么不同?谢谢。推荐信只是对其他东西的推荐。你可以把它当作一个别名。但在内部,编译器可以将其实现为指针,比如,编写int-const&x=42,编译器可以从概念上将其转换为int-const u-blah=42;int const*const x=&;。或者,它可能会优化整个过程。。。但是将引用绑定到右值的正式规则是创建一个临时值,并将引用设置为引用该临时值。更一般情况下,C++98和C++0x的规则略有不同,但大致上就是这样。这意味着,无论如何,无法区分它们。不要忘记C++0x的decltype,常量引用不是整型常量表达式。我不知道如何得到一个有效的C++03程序来打印ref或nonref,但给定上述两个变量并应用于其中一个。没有人问起C++0x,但我想我会把它扔进去。@Johannes:好评论!我的文字词仍然存在,但是如果类型改为int,那么可以通过使用int-const x编译OK的程序来区分它们,而使用int-const&y它不编译,比如说,使用它们作为数组大小。因此,我或许应该写一篇文章,选择一个或另一个都无法影响有效程序的效果,这回避了代码是否编译的问题据我所知,你倾向于同样的观点,但不太确定。但它被反复讨论,没有已知的反例。干杯,很好的回答。我只是想问,在什么意义上第一个是暂时的,这到底意味着什么?它与第二个有什么不同?谢谢。推荐信只是对其他东西的推荐。你可以把它当作一个别名。但在内部,编译器可以将其实现为指针,比如,编写int-const&x=42,编译器可以从概念上将其转换为int-const u-blah=42;int const*const x=&;。或者,它可能会优化整个过程。。。但是将引用绑定到右值的正式规则是创建一个临时值,并将引用设置为引用该临时值。更一般情况下,C++98和C++0x的规则略有不同,但大致上就是这样。这意味着,无论如何,无法区分它们。不要忘记C++0x的decltype,常量引用不是整型常量表达式。我不知道如何得到一个有效的C++03程序来打印ref或nonref,但给定上述两个变量并应用于其中一个。没有人问起C++0x,但我想我会把它扔进去。@Johannes:好评论!我的文字词仍然存在,但是如果类型改为int,那么可以通过使用int-const x编译OK的程序来区分它们,而使用int-const&y它不编译,比如说,使用它们作为数组大小。因此,我或许应该写一篇文章,选择一个或另一个都无法影响有效程序的效果,这回避了代码是否编译的问题据我所知,你倾向于同样的观点,但不太确定。但它被反复讨论,没有已知的反例。干杯,那么是否允许以下情况:double&pi=3.14,或者您是否必须使用const来引用纯值,如3.14?那么是否允许以下情况:double&pi=3.14,或者您必须使用const来引用纯值,如3.14?