出于什么原因将const左值引用绑定到右值?

问题描述 投票:2回答:4

constexpr int& v = 1;,因为v在编译时无法解析,这很有意义。

现在让const int& v = 1;合法令我感到惊讶。

但是我看不出它与const int v = 1;有何不同。

在什么情况下有必要将const左值引用绑定到右值

c++
4个回答
3
投票

constexpr int& vconst int& v是不同的东西。 constexpr int& v表示创建对int的引用,而该引用是constexpr。您不能将其绑定到临时对象,因为不允许对可变对象的左值引用绑定到临时对象。

const int& v另一方面表示创建对const int的引用。由于您无法修改临时状态,因此可以将其绑定到临时状态。

在什么情况下有必要将const左值引用绑定到右值?

C ++ 11之前的版本,这是捕获对临时引用的唯一方法。例如

std::vector<int> make_vec(int size) { return std::vector<int>(size); }

const std::vector<int>& foo = make_vec(1000);

在上面的代码中,忽略了任何优化,这是访问make_vec返回的向量而不复制它的唯一方法。这非常重要,因为它有助于防止C ++的值语义自然创建许多副本。

在C ++ 11之后,我们现在需要的rvalue引用已足够多了,它允许将引用绑定到临时,您可以修改它,因为它们通常不是const


1
投票

像C ++这样的语言是根据它们可以做什么而设计的,而不是根据它们不能做什么而设计。因此,您的问题不应该是“在任何情况下都没有必要” [永远],而应该是“该语言的哪些功能使之成为可能?”在这种情况下,主要特征是所谓的"the most important const",由此const引用可以绑定到右值,从而将其生存期延长到引用范围的末尾。有时对于从函数调用或其他表达式返回的右值很有用。但是整数文字也是右值。指定一个将const引用绑定到任何右值的行为比提出更严格的规则来确定哪些右值值得这种处理更为实际。

出于什么原因有必要将const左值引用绑定到右值?

虽然本身没有必要,但是在调用带有左值引用参数的函数时非常有用:

class foo; void bar(const foo&); bar({}); // lvalue reference bound to rvalue

我将猜测一个答案:似乎没有为该语句the membership access operator (.)定义the membership dereference operator (->)const int& v = 1;,因此该语句必须具有这种效果,即使它不应该如此”真的不能产生那种结果。

另一方面,如果您说const std::string& s = 1;,则除非operator=重载以使其具有您想要的效果,否则这不起作用。

*this的问题可以在编译时发现,但整数值或指针值错误的问题通常不会出现。


0
投票
出于什么原因有必要将const左值引用绑定到右值?

0
投票
我将猜测一个答案:似乎没有为该语句the membership access operator (.)定义the membership dereference operator (->)const int& v = 1;,因此该语句必须具有这种效果,即使它不应该如此”真的不能产生那种结果。
© www.soinside.com 2019 - 2024. All rights reserved.