考虑以下示例:
#include <utility>
struct A { void f() {} };
struct B { void f() & {} };
struct C { void f() && {} };
template<typename T>
auto f() -> decltype(std::declval<T>().f())
{}
int main() {
f<A>();
// f<B>(); // (*)
f<C>();
}
B
当使用(line )调用时(*)
,代码不再编译以在特定情况下std::declval
转换T
为右值引用类型。
如果我们按如下方式稍微改变它,我们就会遇到相反的问题:
// ...
template<typename T>
auto f() -> decltype(std::declval<T&>().f())
{}
// ...
int main() {
f<A>();
f<B>();
// f<C>(); // (*)
}
现在,在特定情况下,(*)
将无法std::declval
将类型转换为左值引用类型。
有没有办法定义一个接受类型的表达式,T
如果它有一个成员函数f
,不管它的引用限定符是什么?
我没有任何真实的案例可以使用它,也无法制作任何真实的使用示例。
这个问题是出于好奇,仅此而已。
我知道如果ref-qualifier存在是有原因的,我不应该尝试破坏课程的设计。