15

is_invocable実際には値ではない派手な新しい prvalues と派手な新しい prvalues があります。

これにより、最初にオブジェクトを論理的に構築し、次に構築を省略せずにオブジェクトを作成できます。

何かを呼び出すことができるかどうかをテストするために使用std::is_invocableすると、prvalue ルールが衝突するように見えるという問題に遭遇しました。

struct no_move {
  no_move(no_move&&)=delete;
  explicit no_move(int) {}
};
void f( no_move ) {}

ftype の prvalue を使用して呼び出すことができるかどうかを尋ねることができますno_moveか?

f( no_move(1) )

std::is_invocable< decltype(&f), no_move >type の prvalue ではないstd::declval<no_move>()ような xvalue を使用するため、機能しません。no_move&&no_move

でもこれは同じでしたが、保証された省略により、一部の関数は xvalue (つまり " T&&") で呼び出し可能になり、他の関数は type の prvalue で呼び出し可能になりTます。

代替手段はありますか、それともこのケースを処理するために独自の特性を発明する必要がありますか?

( の代わりにstd::declval<T>返される理論的な世界では、正しいことをすると私は信じています)。TT&&is_invocable

4

2 に答える 2