采用以下成员函数:
struct T {
template <typename X> void f(X&& x) { /* ... */ }
};
在这种情况下,x
是转发引用,因为 &&
用于模板内的函数参数。这符合预期。
现在使用这个函数:
struct T {
template <typename X> void f(X&& x) && { /* ... */ }
};
我希望 this
会以类似的方式处理;作为转发引用。因此,我希望以下程序能够正常编译和运行:
#include <iostream>
struct T {
template <typename X>
bool operator<(X&& rhs) && {
std::cout << "&&" << std::endl;
return true;
}
};
int main() {
T t;
std::cout << (t < T()) << std::endl;
return 0;
}
但是使用 GCC 4.8.4 和 6.0.1,它不会。相反,我得到以下信息:
rvalue.cpp: In function ‘int main()’:
rvalue.cpp:13:25: error: passing ‘T’ as ‘this’ argument of ‘bool T::operator<(X&&) && [with X = T]’ discards qualifiers [-fpermissive]
std::cout << (t < T()) << std::endl;
this
似乎没有成为转发引用。
这是正确的还是错误的? this
是否应该被视为转发引用?标准的哪一部分规定了这一点?
最佳答案
这里的两个&&
s`被区别对待:
struct T {
template <typename X> void f(X&& x) && { /* ... */ }
};
您是正确的,x
是转发引用。但是右边的&&
是对对象实例的限定。在这种情况下,f()
只能在对象实例是右值时调用(可能会增加混淆的是第一个 &&
需要 x
作为转发引用,但第二个 &&
将隐式对象参数作为右值引用)。即:
T().f(4); // ok
T t;
t.f(4); // error
这与 const
限定的工作方式相同:
struct X { void f(); };
const X cx;
cx.f(); // error
关于c++ - 转发引用、引用限定符和模板成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39232109/