std::initializer_list を右辺値参照ではなく値で取得するのはなぜですか? 質問する

std::initializer_list を右辺値参照ではなく値で取得するのはなぜですか? 質問する

私が見たC++11 コードのほとんどはstd::initializer_list値で取得しますが、右辺値参照で取得されることもあります。これを行う正当な理由はありますか?

たとえば、私がこれまでに目にしたほとんどすべての例では、次のようになります。

class A {
  public:
  A(std::initializer_list<int>);
};

しかし、私は時々これが行われているのを見ます:

class B {
  public:
  B(std::initializer_list<int> &&);
};

右辺値参照の使用法と目的を理解している一般的にですが、 の場合に、なぜこれらのいずれかが他よりも優先されるのでしょうかstd::initializer_list? 私が考えられる唯一の理由は、 ではclass A初期化リストを個別に構築できるようになり、class Bこれが防止されるということです。

std::initializer_list<int> values {1,2,3,4};
A a(values); // valid
B b(values); // error

しかし、それを防ぐことが望ましいことであるという十分な理由が思いつきません。

では、なぜstd::initializer_list値ではなく右辺値参照を使用するのでしょうか?

ベストアンサー1

私は良い理由はわかりませんが、私の推測では、コードの作成者は、初期化リストを値で渡すと、リスト内の要素の不要なコピーが作成されると考えていた可能性があります。もちろん、これは真実ではありません。初期化リストをコピーしても、基礎となる値はコピーされません。

おすすめ記事