很抱歉,如果您之前曾问过这个问题,或者我错过了一些琐碎的事情,但是以下内容对于我来说还是不清楚的。我了解为什么在函数参数不是引用时允许传递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&的行为使我感到困惑。
谢谢。
编辑:建议的问题与我的要求不完全相同。我的问题是,即使它是const,为什么也允许绑定临时对象。链接的问题询问“为什么它不是const时为什么禁止”。
我不理解[当函数参数是const引用时允许传递[右值而不是左值]的原因
这使使用复制构造函数从右值复制成为可能。也可能有其他原因,但这是一个非常有用的功能。
这是错误还是功能?
故意用语言指定。
这是将昂贵的值传递给函数的一种方法。它允许绑定到临时对象,因为有时函数产生的结果也很昂贵,并且您不想通过将每个昂贵的值另存为变量来污染代码... 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());
[请记住:过去,没有移动语义。而且即使这样,每次将值传递给函数时也无法适应我的需求。