Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.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++ 非常量左值引用_C++ - Fatal编程技术网

C++ 非常量左值引用

C++ 非常量左值引用,c++,C++,你为什么能这样做 int a; const double &m = a; int a; double &m = a; 但当你这么做的时候 int a; const double &m = a; int a; double &m = a; 你有错误吗 error: non-const lvalue reference to type 'double' cannot bind to a value of unrelated type 'int' 编辑: 更具

你为什么能这样做

int a;
const double &m = a;
int a;
double &m = a;
但当你这么做的时候

int a;
const double &m = a;
int a;
double &m = a;
你有错误吗

error: non-const lvalue reference to type 'double' cannot bind to a value of unrelated type 'int'
编辑:


更具体地说,我试图理解非常量引用无法绑定临时对象的原因。

这是因为临时引用无法绑定到非常量引用

double &m = a;
a
类型为
int
,正在转换为
double
。这样就创建了一个临时文件。用户定义的类型也是如此

Foo &obj = Foo(); // You will see the same error message.

但在VisualStudio中,由于默认情况下启用了编译器扩展,因此它可以正常工作。但是GCC会抱怨。

< P>因为暂时修改是没有意义的,C++不希望你把非const引用绑定到一个临时的。 比如说

int a;
double &m = a;  // caution:this does not work.
如果有效呢?
a
类型为int,正在转换为double。这样就创建了一个临时文件


您可以修改
m
,它绑定到一个临时变量,但几乎什么也没有发生。修改后,变量
a
没有改变(更糟糕的是,您可能认为
a
已经改变,这可能会导致问题).

这个问题可以用两种方式之一来解释:要么你需要知道有一个允许常量引用绑定到临时值的规则,要么你想知道为什么。你可能会得到两种答案,但你可能只对其中一种感兴趣。。。是哪个?这里的错误信息有点混乱。我希望出现类似-
错误的情况:从类型为“double”的右值初始化类型为“double&”的非常量引用无效。
。但是如果临时值包含指向其他资源的指针怎么办?那么,对临时文件进行修改并不是毫无意义的。@Enzo这看起来不是一个好的做法。或者你可以在这里展示一个很好的例子?@Enzo如果临时对象包含指向其他资源的指针,那么应该使用move构造函数来处理它。临时对象无论如何都会被删除,所以我认为你不应该对它做任何重要的事情。@xinnjie,允许可变临时对象在某些情况下可能有用。例如
将数据写入(可写文件(“/some/path”)在这种情况下,存在一个持久的副作用,它比临时可写的_文件对象更有效。我可以想到其他的例子,包括过滤或调整输入到某个算法或从某个算法输出。我可以想到其他一些例子,包括在一些算法中封装可变状态的级别。例如,解析器可以从临时词法分析器中提取输入。然而,不管是好是坏,C++不支持传递可变的临时变量。至于你的例子,移动setantic可能有用吗?类似于
将数据写入(可写文件&&)
,varibale的生命周期更加清晰。但毕竟,我同意你们的观点,在某些用法中,支持传递可变临时变量是很方便的。我反对,因为你们缺少解决方案。只要再写一句话,所有的问题就解决了。在“Foo&obj=Foo();”的情况下,您会怎么做?@AbbasPerç在解决方案中已经给出了一个问题:只需将其设为常量:const Foo&obj=Foo();