あなたがその過負荷を持っている、とconst
右辺値で渡すようにしようとしなかった場合はどうなるかを考えてみましょう:
template <typename T> const T &as_const(T &t) { return t; }
struct S { };
const S f() { return S{}; }
int main() {
// auto & ref = as_const(S()); // correctly detected as invalid already
auto & ref = as_const(f()); // accepted
}
T
がconst S
と推測されますので、これは受け入れられるだろう、と一時はに結合することができ、 const S &
。結果は、あなたが誤って左値参照を取得したことになります。これはref
が初期化された直後に破棄されます。左辺値を取っているほとんどすべてのユーザ(変数または関数パラメータであっても)は、一時的に渡されることを期待しません。サイレントに一時的に受け入れることは、あなたが簡単に黙って参照を取得することを意味します。
出典
2016-01-02 12:56:21
hvd
@dypはい、まさにそうでなければ、それは問題ではありません。 :)おそらく私はそれを少し拡張する必要があります。ありがとうT.C.ところで、私は最初にxvalueの例を持っていましたが、例を単純化するとテキストを更新するのを忘れてしまいました。 – hvd
はい私のコメントはあなたの答えのいくつかのさらなる説明として、より多くを意味しました。この制限が有用であるかどうかわかりません。 'as_const(T const &&)'は単に 'T const &&'を返すだけで、コンパイラは 'T const&'変数を変数定義の 'T const &&'にバインドすることについては警告します。 – dyp
@dyp次に、 'T const &&'オーバーロードを返す 'as_const(T &&)'(そこに 'const'はありません)があります。はい、それは可能ですが、 'as_const'を呼び出してrvalueを渡すことは、サポートする必要があるものよりも間違いの可能性が高いと思われます。 – hvd