【问题标题】:Is it possible to call a function which takes a const rvalue as a parameter? [duplicate]是否可以调用以 const 右值作为参数的函数? [复制]
【发布时间】:2017-05-05 22:00:54
【问题描述】:

最近我不小心编写了以下代码:

void someFunction(const SomeClass&& value){
    //Some Code
}

我并不是要在 value 参数中添加 'const' 关键字。然而,这让我想到:是否有可能以某种方式调用这个函数,如果存在没有 const 的等效函数?如果是,这是否有意义,是否有实际用途?

【问题讨论】:

  • codesynthesis.com/~boris/blog/2012/07/24/…。 “具体来说,一个 const 右值将更喜欢绑定到 const 右值引用而不是 const 左值引用。”但是,您不应该为 const 右值而烦恼。它们没有多大意义。

标签: c++ rvalue-reference rvalue


【解决方案1】:

这段代码:

#include <iostream>
using namespace std;

struct s{};     

void someFunction(s& value){ std::cout << "ref" << std::endl; }

void someFunction(const s&& value){ std::cout << "const" << std::endl; }

void someFunction(s&& value){ std::cout << "non const" << std::endl; }

const s foo() { return s(); }
s bar() { return s(); }


int main() {
    someFunction(bar());
    someFunction(foo());
    return 0;
}

Prints

non const
const

对于一些解释(我无法提供;)我将您推荐给this site。最相关的报价是:

[...] 这使得 const 右值引用毫无用处。想一想:如果 我们所需要的只是对对象的不可修改的引用(右值或 左值),然后一个 const 左值引用完美地完成了这项工作。这 我们想要挑出右值的唯一情况是如果我们想要 移动它们。在这种情况下,我们需要一个可修改的引用。

我能想象的唯一用例是使用someFunction 来检测第二个函数是返回const 还是非const,但我想有更简单的方法可以找到它。

附带说明:当您在上述代码it prints 中将s 替换为int 时:

non const 
non const

那是因为(引自同一网站,pizer 的评论):

标量类型没有 const 纯右值。对于一个 const rvalue 你 要么需要 Xvalue 和/或类类型对象。 [...]

【讨论】:

  • 查看链接文章的评论,了解更多关于为什么int 使用非const 重载的信息:"没有标量类型的 const prvalues。对于 const rvalue 你要么需要一个 Xvalue 和/或一个类类型对象。我几乎可以肯定,一个符合标准的编译器会像 f(1) 一样对待 f(g()) 在重载决议方面,因为 g 只返回一个值和不是一个对象。”
  • @clcto 感谢您的澄清
猜你喜欢
  • 2019-10-10
  • 2018-08-18
  • 2010-12-14
  • 2015-03-10
  • 2010-10-09
  • 2014-06-03
  • 2016-07-03
  • 2019-10-15
  • 1970-01-01
相关资源
最近更新 更多