之前在有关 rvalue 函数重载的讨论中说到参数是 rvalue 的情况, 很自然地, 如果认为 (简单起见, 非
virtual
的) 对象成员函数等价于普通函数加上一个 this
参数, 那么如何分辨 this
参数是 left value 还是 rvalue 呢? 受到对象成员函数可以仅根据 const
修饰与否来重载这个现状的启发, 对于对象本身是 rvalue 的重载当然很可能是为成员函数加上某种修饰, 类似下面这个样子struct Type {
void func(); // for normal left reference
void func() const; // for const left reference
void func() rvalue-qualified-id; // for rvalue reference
};
#include <cstdio>
struct Type {
Type() {}
void func() &
{
puts("a");
}
void func() const&
{
puts("b");
}
void func() &&
{
puts("c");
}
};
int main()
{
Type a;
a.func();
Type const b;
b.func();
Type().func();
return 0;
}
a
b
c
&&
修饰), 那么其它重载也必须标注上一个 &
号. 读的时候去掉前两个重载的 &
就很容易看明白了. 而最后一个重载正是给 rvalue 用的. 这样变态地使用符号, 看来标准委员会看来是毫不介意 C++ 逐渐演化成既不表意又不象形的新世纪面向对象强化版 Brainfuck. 真的在代码中写这种东西的死 coder 是伤不起的!