次の例を検討してください。
#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
参照修飾子に関係なくT
、メンバー function がある場合に型を受け入れる式を定義する方法はありますか?f
私はそれを使用する実際のケースはなく、実際の使用例を作成することはできません.
この質問は好奇心のためであり、それ以上のものではありません。ref-qualifier
がある
場合には理由があることを理解しており、クラスの設計を壊そうとするべきではありません。