【发布时间】:2017-06-01 13:24:08
【问题描述】:
最近我了解了通用(或转发)引用。它们仅适用于模板中的类型推导或auto / decltype。
当我使用左值引用 (&) 时,我无法将它绑定到右值(临时)对象。当我使用右值引用 (&&) 时,我无法将它绑定到左值对象。转发引用可以与非常量左值和右值一起使用。
是否可以实现不进行类型推导的转发引用行为?
void Foo(string && s); // rvalue-reference
void Bar(const string & s); // const lvalue-reference
void Baz(auto && s); // forwarding reference
string s = "lvalue string";
Foo(s); // error: cannot bind lvalue to &&
Foo("test"); // OK
// works, but can't take non-const value
Bar(s);
Bar("test");
// works
Baz(s);
Baz("test");
【问题讨论】:
-
const &是在&&存在之前完成的。 -
您始终可以使用 SFINAE 限制类型。
-
When I use lvalue-reference (&), I can't bind it to non-const object.当然,您可以将左值引用绑定到非常量对象。也许您的意思是非常量引用不能绑定到 const 对象?或者那个非常量引用不能绑定到一个右值(比如一个临时值)? -
@Rakete1111 谢谢,不知道这件事
-
问题的真正症结在于如何处理论点(?)抛开语言律师的东西,我认为如果你把问题反过来看,生活会变得更简单您将在函数中处理该参数。如果您需要复制它,请始终按值接受然后移动,否则通过 const 引用获取它。那么你发送给它的内容并不重要 - 坦率地说 - 无关紧要。
标签: c++ c++11 language-lawyer rvalue-reference perfect-forwarding