Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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++ 为什么常量引用在分配l值和r值时表现不同?_C++_Reference_Constants - Fatal编程技术网

C++ 为什么常量引用在分配l值和r值时表现不同?

C++ 为什么常量引用在分配l值和r值时表现不同?,c++,reference,constants,C++,Reference,Constants,给出下面的代码示例 #include<iostream> using namespace std; int main(){ int a = 4; const int &b = a; const int &c = a * 2; a = 10; cout << b << endl; cout << c << endl; return 0; } 为什么在分配L值和R

给出下面的代码示例

#include<iostream>

using namespace std;

int main(){
    int a = 4;
    const int &b = a;
    const int &c = a * 2;
    a = 10;
    cout << b << endl;
    cout << c << endl;
    return 0;
}
<>为什么在分配L值和R值给const引用时,C++设计的行为不同?

const int &b = a;
const int &c = a * 2;
b
这里是
a
的参考(别名);当
a
改变值时,
b
将反映这一点

c
绑定到由表达式
a*2
计算的临时对象,因为
a
在计算后更改了值,因此计算不会重新计算,
c
的值保持原来计算的值

b
这里是
a
的参考(别名);当
a
改变值时,
b
将反映这一点

c
绑定到由表达式
a*2
计算的临时对象,因为
a
在计算后更改了值,因此计算不会重新计算,
c
的值保持原来计算的值。

表达式:

const int &c = a * 2;
不会将结果引用
c
绑定到
a
。相反,它将它绑定到表达式
a*2
的结果的右值,该表达式是一个临时对象,不再与
a
有任何关系-因此更改
a
不会影响它

这与
b
相反,后者是对对象
a

表达式的引用:

const int &c = a * 2;
不会将结果引用
c
绑定到
a
。相反,它将它绑定到表达式
a*2
的结果的右值,该表达式是一个临时对象,不再与
a
有任何关系-因此更改
a
不会影响它


这与
b
相反,后者是对对象
a

的引用。其他答案已经解释了您获得输出的原因。但是,让我们假设您想要

const int &c = a * 2;
a = 10;
cout << c << endl;
但是,我强烈建议您不要使用此代码,我只是想证明这是可能的(我将评论中的“这太雄心勃勃了”视为一种挑战)


我想使用lambdas可以以一种更优雅的方式完成,不幸的是,我对它们不太熟悉。

其他答案已经解释了为什么您会得到输出。但是,让我们假设您想要

const int &c = a * 2;
a = 10;
cout << c << endl;
但是,我强烈建议您不要使用此代码,我只是想证明这是可能的(我将评论中的“这太雄心勃勃了”视为一种挑战)


我想使用lambdas可以用一种更优雅的方式来实现这一点,不幸的是我对它们不太熟悉。

对象c绑定到的对象与对象b绑定到的对象不同。您希望每次更改
a
时都能从表达式
a*2
自动重新计算
c
?那太有野心了!!是的,真正的问题是你认为会发生什么,以及为什么。。。当你考虑到任何涉及左值的临时引用所需的内容总是反映对所述左值的任何更改时,事情很快就会变得可笑地难以管理,语法上毫无希望地模棱两可,并且真的很可怕。从字面上看:RHS是一个右值临时变量,它的生存期由
常量
引用延长。实际上,这就像声明名为
c
const
左值,而不是引用,虽然机制当然是后者。对象c绑定到的对象与对象b绑定到的对象不同。您希望每次更改
a
,都能从表达式
a*2
自动重新计算
c
?那太有野心了!!是的,真正的问题是你认为会发生什么,以及为什么。。。当你考虑到任何涉及左值的临时引用所需的内容总是反映对所述左值的任何更改时,事情很快就会变得可笑地难以管理,语法上毫无希望地模棱两可,并且真的很可怕。从字面上看:RHS是一个右值临时变量,它的生存期由
常量
引用延长。实际上,这就像声明名为
c
const
左值,而不是引用,尽管机制当然是后者std::cout@underline\u d但是可以编写一个像我这样的结构,将lambda作为参数,那么至少我的方法是灵活的。然而,我强烈怀疑使用
操作符int
是否是一个好的理想,一个接收和存储lambda的模板结构。但是是的,我不确定这有多大的实用价值,至少在普通情况下没有。它与引用的概念完全正交。@underline\d好吧,我们可以编写一个赋值运算符,将1/2的值赋给引用的int(或者更一般地说,是应用反函数后的值)。我很有意思,但我会小心使用这样的东西。当然,我认为它在相关的情况下非常有用——比如数学模型或其他,这是一个很好的例子——但这样的情况相对较少。只是尽量避免人们认为这是一种普遍适用的技术!这很简单-
auto-myNonRef=[&x]{return x*2;};/*…*/std::cout@underline\u d但是可以编写一个像我这样的结构,将lambda作为参数,那么至少我的方法是灵活的。然而,我强烈怀疑使用
操作符int
是否是一个好的理想,一个接收和存储lambda的模板结构。但是是的,我不确定这有多大的实用价值,至少在普通情况下没有。它与引用的概念完全正交。@underline\d好吧,我们可以编写一个赋值运算符,赋值1/2的值