右值参数隐式生成的函数重载?

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

很抱歉,如果您之前曾问过这个问题,或者我错过了一些琐碎的事情,但是以下内容对于我来说还是不清楚的。我了解为什么在函数参数不是引用时允许传递rvalue而不是lvalue的原因,但是我不明白当函数参数是const引用(对我而言没有意义)但被禁止时允许传递rvalue的原因通过常规引用(逻辑行为)时。

假设我有以下代码

struct A
{
    explicit A(std::string s) : name{ s } { };
    A(const A& a) : name{ a.name } {  }
    A& operator=(const A& a) { name = a.name; return *this; }
    A(A&& a) noexcept : name{} { std::swap(name, a.name); }
    A& operator= (A&& a) noexcept { std::swap(name, a.name); return *this; }
    void talk() const{ std::cout << name << " says blablabla.\n"; }
private:
    std::string name;
};

void f(A a) {}
void g(A& a) {}
void h(const A& a) {}

int main()
{
    A a{ "a" };
    f(a);
    f(A{ "temp" });
    g(a);
    g(A{ "temp" }); // Compile error
    h(a);
    h(A{ "temp" });
}

现在,我理解为什么A &&对于f隐式生成重载,但是A&和const A&的行为使我感到困惑。

  1. 为什么编译器禁止传递A &&而不是A&,但是允许传递A &&而不是A&?
  2. 这是错误还是功能?
  3. 如果它是一项功能,允许它的原因是什么?

谢谢。

编辑:建议的问题与我的要求不完全相同。我的问题是,即使它是const,为什么也允许绑定临时对象。链接的问题询问“为什么它不是const时为什么禁止”。

c++ overloading pass-by-reference
2个回答
0
投票

我不理解[当函数参数是const引用时允许传递[右值而不是左值]的原因

这使使用复制构造函数从右值复制成为可能。也可能有其他原因,但这是一个非常有用的功能。

这是错误还是功能?

故意用语言指定。


0
投票

这是将昂贵的值传递给函数的一种方法。它允许绑定到临时对象,因为有时函数产生的结果也很昂贵,并且您不想通过将每个昂贵的值另存为变量来污染代码... C ++为您做到这一点,这就是我们获得临时方法的原因。

它增加了一致性:

//  Whichever you pick, the code below shall be fine.
//using Value = int;
using Value = std::string;
//using Value = std::vector<std::string>;

Value get_something();
Value process(const Value & text);
void set_something(const Value & name);

set_something(process(get_something()); 

[请记住:过去,没有移动语义。而且即使这样,每次将值传递给函数时也无法适应我的需求。

© www.soinside.com 2019 - 2024. All rights reserved.