...ちょうど
const auto object = create();
を書きます
...または
const auto object{ create() };
=
はコピーコンストラクタ呼び出しをelidingコンパイラに依存しているが、私はそれを行うに失敗した任意の現存コンパイラのことは知りません。
得られた明瞭さは、参照によって提供される保証よりもはるかに重要です(参照を使用する場合、通常の&
参照を使用してください)。つまり、メンテナンスプログラマーが参照の根拠を理解しようとするのに時間を浪費することを避けることができます。型が明示的に指定されていれば、多形参照の場合がありますが、Petru Margineanのトリックですが、auto
となっているので、メンテナンスプログラマーは一定期間支払ってしまいます。一方
、const T&&
はメンバ関数の&&
修飾子を採用することが十分に有用であると考えたと同様に、引数として一時的の場合をキャッチする引数の型として機能オーバーロードのために有用であり得ます標準ではたとえば、私はこれをお勧めしませんが、実際の引数へのポインタが後で使用するために格納されている場合、一時的なポインタを格納したくないと思われます。
struct Expr{ virtual ~Expr(){} };
struct Sum_expr: Expr
{
const Expr* a_;
const Expr* b_;
Sum_expr(Expr const& a,Expr const& b): a_(&a), b_(&b) {}
template< class A >
Sum_expr(A&&, Expr const&& b) = delete;
template< class B >
Sum_expr(Expr const&& a, B&&) = delete;
};
auto main()
-> int
{
Expr a;
Expr b;
Sum_expr sum{ a, b };
Sum_expr sum2{ a, Expr() }; //! Nope, won't compile.
}
注:ここではA&&
とB&&
サポート右辺と左辺値実引数の両方、彼らは普遍的な参照だからすなわち、それらは、必ずしも右辺値参照はありません。
しかし、オーバーロードして区別するのではなく、私が慣れ親しんだことで、ポインタが技術的にnullpointerになる可能性があるとしても、仮引数をポインタにすると思います。意図をより明確に伝えます。
Sum_expr(Expr const* a, Expr const* b);
あなたは 'const auto&'で全く同じことを達成できます。 – StoryTeller
ご希望の時にYouTubeのビデオを右クリックし、「現時点でビデオURLをコピーする」を選択すると、その時間に直接リンクすることができます:https://youtu.be/dTeKf5Oek2c?t=2937 – Tas
おそらくなぜ 'const auto &&'がなぜ問題の本体で役に立たないと思われるのかを説明するでしょう。 – juanchopanza