非常量引用为什么不能绑定到临时对象?

阿列克谢·马里斯托夫(Alexey Malistov)

为什么不允许获取对一个临时对象的非常量引用,哪个函数getx()返回?显然,这是C ++标准所禁止的,但是我对这种限制的目的感兴趣,而不是对该标准的引用

struct X
{
    X& ref() { return *this; }
};

X getx() { return X();}

void g(X & x) {}    

int f()
{
    const X& x = getx(); // OK
    X& x = getx(); // error
    X& x = getx().ref(); // OK
    g(getx()); //error
    g(getx().ref()); //OK
    return 0;
}
  1. 显然,对象的生存期不可能是原因,因为C ++ Standard不禁止对对象的常量引用
  2. 显然,在上面的示例中,临时对象不是常量,因为允许调用非常量函数。例如,ref()可以修改临时对象。
  3. 另外,ref()允许您欺骗编译器并获得指向该临时对象的链接,从而解决了我们的问题。

此外:

他们说“将临时对象分配给const引用可延长该对象的寿命”,“关于非const引用却一无所获”。还有一个问题以下分配是否会延长临时对象的寿命?

X& x = getx().ref(); // OK
k

在此Visual C ++博客文章中,有关右值引用

... C ++不想让您不小心修改临时变量,但是直接在可修改的rvalue上调用非常量成员函数是显式的,因此允许...

基本上,您不应该因为临时对象是临时对象并且会在任何时候死掉的原因而尝试修改它们。允许您调用非const方法的原因是,只要您知道自己在做什么并且对它很明确,就可以做一些“愚蠢”的事情(例如,使用reinterpret_cast)。但是,如果将一个临时对象绑定到一个非const引用,则可以继续将其永久传递给“永久”对象,以使对对象的操作消失,因为在整个过程中您完全忘记了这是一个临时对象。

如果我是你,我会重新考虑我的功能设计。为什么g()接受引用,它会修改参数吗?如果不是,请使其成为const引用,如果是,请为什么尝试将临时变量传递给它,您不在乎它是您要修改的临时变量吗?为什么getx()无论如何都会返回临时值?如果您与我们分享您的真实情况以及您想要实现的目标,则可能会得到一些很好的建议。

违反语言并欺骗编译器很少解决问题-通常会产生问题。


编辑:解决评论中的问题:1) X& x = getx().ref(); // OK when will x die? -我不知道,我不在乎,因为这正是我“违背语言”的意思。该语言表示:“除非声明绑定到const引用,否则临时语句会在语句末尾死亡,在这种情况下,当引用超出范围时,它们就会死亡”。应用该规则,似乎x在下一条语句的开头已经死了,因为它没有绑定到const引用(编译器不知道ref()返回的内容)。但是,这只是一个猜测。

2)我清楚地说明了这个目的:不允许您修改临时对象,因为这样做没有意义(忽略C ++ 0x rvalue引用)。问题“那为什么允许我打电话给非const成员?” 是一个不错的选择,但是我没有比我上面已经说过的更好的答案了。

3)好吧,如果我X& x = getx().ref();对语句结尾处的x是正确的,那么问题就显而易见了。

无论如何,根据您的问题和评论,我认为即使这些额外的答案也无法满足您。这是最后的尝试/摘要:C ++委员会认为修改临时文件没有意义,因此,它们不允许绑定到非const引用。我不知道可能是某些编译器实现或历史性问题也涉及其中。然后,出现了一些特定情况,并决定在各种情况下,它们仍将允许通过调用非const方法直接进行修改。但这是一个例外-通常不允许您修改临时文件。是的,C ++通常很奇怪。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么const引用不能延长通过函数传递的临时对象的寿命?

来自分类Dev

关于将const引用绑定到临时对象的子对象

来自分类Dev

为什么不能从对象访问常量?

来自分类Dev

为什么C ++左值对象不能绑定到右值引用(&&)?

来自分类Dev

为什么不能直接在临时对象上调用operator()?

来自分类Dev

为什么右值引用作为返回类型不能是非常量引用的初始化?

来自分类Dev

除了写临时文件无效之外,为什么右值不能绑定到非常量左值引用?

来自分类Dev

对类型的非常量左值引用...无法绑定到类型的临时对象

来自分类Dev

为什么不能将项目分配给对象的常量?

来自分类Dev

类型“”的非常量左值引用无法绑定到类型“ *”的临时对象

来自分类Dev

将临时对象强制转换为非常量引用时出错

来自分类Dev

为什么对常量临时值的本地引用似乎超出了其定义的方法?

来自分类Dev

我想将非常量左值引用绑定到类型T的临时类型T

来自分类Dev

为什么此代码给出错误“无法将类型'char *&'的非常量左值引用绑定到类型为'char *'的右值”

来自分类Dev

如何将临时对象作为非常量引用传递给成员函数?

来自分类Dev

为什么禁止非常量引用位域?

来自分类Dev

为什么我们可以非常量引用一个临时对象并延长其寿命?

来自分类Dev

为什么仍然可以访问对临时对象的引用?

来自分类Dev

对指针错误的引用:非常量左值引用“ const * FooBarClass”无法绑定到临时对象

来自分类Dev

IIS为什么将URL重定向到临时路径

来自分类Dev

为什么临时对象可以绑定到 const 引用?

来自分类Dev

来自 const char* 类型的临时对象的 cost char*& 类型的非常量引用的无效初始化

来自分类Dev

C++ 对非常量对象的常量引用和对非常量对象的非常量引用之间的区别

来自分类Dev

返回非常量引用会导致绑定引用错误

来自分类Dev

将父对象的事件绑定到临时子对象的方法

来自分类Dev

非常量左值引用类型 _normal_iterator<> 无法在 gcc 中绑定类型为 _normal 的临时迭代器

来自分类Dev

为什么 const 临时绑定到右值引用参数?

来自分类Dev

返回对绑定到临时的引用参数的引用时的悬空引用

来自分类Dev

对类型“pair<...>”的非常量左值引用不能绑定到“pair<...>”类型的临时变量

Related 相关文章

  1. 1

    为什么const引用不能延长通过函数传递的临时对象的寿命?

  2. 2

    关于将const引用绑定到临时对象的子对象

  3. 3

    为什么不能从对象访问常量?

  4. 4

    为什么C ++左值对象不能绑定到右值引用(&&)?

  5. 5

    为什么不能直接在临时对象上调用operator()?

  6. 6

    为什么右值引用作为返回类型不能是非常量引用的初始化?

  7. 7

    除了写临时文件无效之外,为什么右值不能绑定到非常量左值引用?

  8. 8

    对类型的非常量左值引用...无法绑定到类型的临时对象

  9. 9

    为什么不能将项目分配给对象的常量?

  10. 10

    类型“”的非常量左值引用无法绑定到类型“ *”的临时对象

  11. 11

    将临时对象强制转换为非常量引用时出错

  12. 12

    为什么对常量临时值的本地引用似乎超出了其定义的方法?

  13. 13

    我想将非常量左值引用绑定到类型T的临时类型T

  14. 14

    为什么此代码给出错误“无法将类型'char *&'的非常量左值引用绑定到类型为'char *'的右值”

  15. 15

    如何将临时对象作为非常量引用传递给成员函数?

  16. 16

    为什么禁止非常量引用位域?

  17. 17

    为什么我们可以非常量引用一个临时对象并延长其寿命?

  18. 18

    为什么仍然可以访问对临时对象的引用?

  19. 19

    对指针错误的引用:非常量左值引用“ const * FooBarClass”无法绑定到临时对象

  20. 20

    IIS为什么将URL重定向到临时路径

  21. 21

    为什么临时对象可以绑定到 const 引用?

  22. 22

    来自 const char* 类型的临时对象的 cost char*& 类型的非常量引用的无效初始化

  23. 23

    C++ 对非常量对象的常量引用和对非常量对象的非常量引用之间的区别

  24. 24

    返回非常量引用会导致绑定引用错误

  25. 25

    将父对象的事件绑定到临时子对象的方法

  26. 26

    非常量左值引用类型 _normal_iterator<> 无法在 gcc 中绑定类型为 _normal 的临时迭代器

  27. 27

    为什么 const 临时绑定到右值引用参数?

  28. 28

    返回对绑定到临时的引用参数的引用时的悬空引用

  29. 29

    对类型“pair<...>”的非常量左值引用不能绑定到“pair<...>”类型的临时变量

热门标签

归档