私が与える場合のstd :: result_ofは、オーバーロードされたメソッド
typedef std::vector<int> v;
以下(代替v::const_iterator
を使用することであるが、これはconst_iterator
に依存する定数イテレータの種類を捕捉するために使用することができますメンバーのタイプは、明示的にクラスで定義されている。
typedef typename std::result_of<decltype(&v::cbegin)(v*)>::type const_iterator;
を確かに、我々は上記の私たちが望むようないことを確認することができます。
static_assert(std::is_same<const_iterator, typename v::const_iterator>::value);
しかし、私は以下でコンパイラの失敗を見つける。
typedef typename std::result_of<decltype(&v::begin)(v*)>::type iterator;
コンパイラは、メソッドが(const修飾子によって)オーバーロードされていると不平を言うと戸惑うことがあると文句を言います。しかし、私はあいまいさを解決する構文を見つけることができません。少なくともconstバージョンだけがconstオブジェクトで動作できるので、以下は明白であると予想します。しかし、以下にも同様に問題がある。
typedef typename std::result_of<decltype(&v::begin)(const v*)>::type const_iterator2;
beginの特定のconstまたはnonconstバージョンをどのように参照しますか?
私はこのレスポンスを追加しましたが、上記の 'v *'引数の 'const'修飾子があいまいさを解決しないのはなぜですか? – epl
'std :: declval()'の戻り値の型は 'v'ではありません。 –
skypjack
@eplは、 '&'がパラメータを見ている前に曖昧な関数名のアドレスを取得しようとしましたが失敗したためです。 –