2016-01-02 12 views
18

私は、次をお読みください。as_constのconst && overloadが削除されるのはなぜですか? <a href="http://talesofcpp.fusionfenix.com/post-23/interlude" rel="noreferrer">blog on the progress of C++17</a>で

P0007は単に 参照を取り、constへの参照として返すヘルパー関数テンプレートas_constを、提案しています。

template <typename T> std::add_const_t<T>& as_const(T& t) { return t } 
template <typename T> void as_const(T const&&) = delete; 

なぜconst&&過負荷が削除されますか?

答えて

12

あなたがその過負荷を持っている、と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 
} 

Tconst Sと推測されますので、これは受け入れられるだろう、と一時はに結合することができ、 const S &。結果は、あなたが誤って左値参照を取得したことになります。これはrefが初期化された直後に破棄されます。左辺値を取っているほとんどすべてのユーザ(変数または関数パラメータであっても)は、一時的に渡されることを期待しません。サイレントに一時的に受け入れることは、あなたが簡単に黙って参照を取得することを意味します。

+0

@dypはい、まさにそうでなければ、それは問題ではありません。 :)おそらく私はそれを少し拡張する必要があります。ありがとうT.C.ところで、私は最初にxvalueの例を持っていましたが、例を単純化するとテキストを更新するのを忘れてしまいました。 – hvd

+0

はい私のコメントはあなたの答えのいくつかのさらなる説明として、より多くを意味しました。この制限が有用であるかどうかわかりません。 'as_const(T const &&)'は単に 'T const &&'を返すだけで、コンパイラは 'T const&'変数を変数定義の 'T const &&'にバインドすることについては警告します。 – dyp

+1

@dyp次に、 'T const &&'オーバーロードを返す 'as_const(T &&)'(そこに 'const'はありません)があります。はい、それは可能ですが、 'as_const'を呼び出してrvalueを渡すことは、サポートする必要があるものよりも間違いの可能性が高いと思われます。 – hvd

関連する問題