我偶然发现了 Scott Mayers 关于通用参考的文章,链接。
根据我对通用参考的理解,某种T&&
类型在不同的上下文中可能意味着右值或左值类型。
例如:
template<typename T>
void f(T&& param); // deduced parameter type ⇒ type deduction;
// && ≡ universal reference
在上面的示例中,取决于模板参数,T&&
它可以是左值或右值,也就是说,这取决于我们如何调用f
int x = 10;
f(x); // T&& is lvalue (reference)
f(10); // T&& is rvalue
然而,根据 Scott 的说法,如果我们应用于const
上面的示例,则类型T&&
始终是右值:
template<typename T>
void f(const T&& param); // “&&” means rvalue reference
引用文章:
即使简单地添加 const 限定符也足以禁用将“&&”解释为通用引用:
问题:
为什么要const
制作“通用”参考右值?
我认为这是不可能的,因为下面的代码会造成混淆:
template<typename T>
void f(const T&& param); // “&&” means rvalue reference
int x = 10;
f(x); // T&& is lvalue (reference) // how does 'x' suddenly become an rvalue because of const?
f(10); // T&& is rvalue // OK