为什么要通过rvalue引用和值来获取std :: initializer_list?

wjl*_*wjl 17 c++ initializer-list rvalue-reference c++11

std::initializer_list我所看到的大多数C++ 11代码都是按值来获取的,但有时它是由右值引用获取的.这样做有什么好的理由吗?

例如,我遇到的几乎所有例子都是这样的:

class A {
  public:
  A(std::initializer_list<int>);
};
Run Code Online (Sandbox Code Playgroud)

但我偶尔会看到这件事:

class B {
  public:
  B(std::initializer_list<int> &&);
};
Run Code Online (Sandbox Code Playgroud)

我理解一般的rvalue引用的用途和目的,但为什么在a的情况下,其中一个优先于另一个std::initializer_list?我唯一能想到的是class A允许初始化列表单独构建,并class B防止这种情况发生.

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

但我想不出一个很好的理由,为什么要防止这是一件令人满意的事情.

那么,为什么会std::initializer_list采用右值参考而不是值?

zmb*_*zmb 7

我不确定我有充分的理由,但我的猜测是代码的作者可能认为按值传递初始化列表会使列表中的元素不必要的副本.当然,这不是真的 - 复制初始化列表不会复制基础值.