考慮下面的例子:追蹤返回類型,declval和引用限定符:它們可以一起工作嗎?
#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
(線(*)
)被調用,代碼不再編譯std::declval
轉換T
在特定情況下的右值引用類型。
如果我們改變它稍微因爲它遵循,我們有相反的問題:
// ...
template<typename T>
auto f() -> decltype(std::declval<T&>().f())
{}
// ...
int main() {
f<A>();
f<B>();
// f<C>(); // (*)
}
現在在(*)
行不會爲std::declval
工作轉換的類型在特定情況下,一個左值引用類型。
有沒有什麼辦法來定義一個表達式,如果它有一個成員函數f
接受類型T
,無論它的引用限定符是什麼?
我沒有在我會用任何真實的案例,我不能使用任何真實的例子。
這個問題是爲了好奇,沒有更多。
我知道如果有ref-qualifier是有原因的,我不應該試圖破壞這個類的設計。
怎麼樣'decltype(&T :: F)'? – Brian
不適用於重載'f' – krzaq
@Brian好吧,它可以在這個最小的例子中工作,但如果你有參數在_invokation_中使用,它將不起作用。 – skypjack