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

时间:2014-02-19 00:02:20

标签: c++ c++11 rvalue-reference initializer-list

我所看到的大部分C ++ 11代码都是std::initializer_list的值,但它有时会被rvalue引用占用。有没有什么好理由这样做?

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

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

但我偶尔会看到这件事:

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

我理解rvalue引用的用法和目的,但为什么在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

2 个答案:

答案 0 :(得分:7)

我不确定我是否有良好的原因,但我的猜测是代码的作者可能认为按值传递初始化列表会使元素的不必要副本列表。当然,这不是真的 - 复制初始化列表不会复制基础值。

答案 1 :(得分:4)

std::initializer_list即使按值传递也会体现引用语义,因此通过引用传递最多会产生误导。 (它只包含非拥有指针。)

有通用引用绑定到任何东西,但它们不能通过 braced-init-list 语法(即{ x, y })初始化,因此获得initializer_list引用这种方式会综合考虑因素。