为什么 const 左值引用可以引用可变右值引用?

2024-03-01

在 C++11 中,可以使用可变右值引用来初始化 const 左值引用。然后,右值引用的值可以发生变化,产生 const 左值引用的可见突变。这是一个例子:

int && rval = 3;
const int & lval = rval;

cout << "lval = " << lval << endl;
cout << "rval = " << rval << endl;

rval ++;

cout << "lval = " << lval << endl;

输出(来自 clang 3.2 和 gcc 4.8.2 均带有 -std=c++11):

lval = 3
rval = 3
lval = 4

I would guess这样做的原因是指称对象无法修改through左值引用,但可以通过右值引用进行修改。但是,我不明白为什么允许 const 左值引用可变对象。

有人可以解释一下这样做的理由,并提供处理这种情况时的最佳实践吗?另外,还有其他类似的可以颠覆常量的例子吗?


但是,我不明白为什么允许 const 左值引用可变对象

有一个const对某物的引用仅意味着您无法通过该引用修改该对象。这并不意味着任何人都不允许更改该对象。

假设你有一个函数:

void f(Foo const& bar);

该函数向调用者声明它不会修改bar。就是这样。仅此而已,仅此而已。它没有说明发生了什么bar while f正在执行(例如在另一个线程中);该语言没有办法表达这样的约束。

最后一点:

int && rval = 3;

rval is an lvalue。它有一个名称,并且可以位于作业的左侧,正如您的代码清楚地演示的那样。右值引用和左值引用之间的区别在于,右值引用可以bind到右值——并不是说它们本身就是右值。

这就是为什么给出类似的东西

void foo(unique_ptr<X>&& x)
{
    aVector.emplace_back(x);
}

不编译。x被声明为右值引用,但在内部foo它有一个名称,可以位于赋值的左侧,并且是一个左值。将其移动到其他东西需要使用move或类似的:

void foo(unique_ptr<X>&& x)
{
    aVector.emplace_back(move(x)); // Ok
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 const 左值引用可以引用可变右值引用? 的相关文章

随机推荐