为什么要采用 std::initializer_list 按右值引用与按值

Why take a std::initializer_list by rvalue reference vs. by value?

本文关键字:引用 list initializer std 为什么      更新时间:2023-10-16

我见过的大多数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呢?

我不确定我是否有充分的理由,但我的猜测是代码的作者可能认为按值传递初始值设定项列表会对列表中的元素进行不必要的复制。 当然,这不是真的 - 复制初始值设定项列表不会复制基础值。

std::initializer_list即使

按值传递也体现了引用语义,因此通过引用传递充其量是误导性的。(它仅包含非拥有指针。

有绑定到任何内容的通用引用,但它们不能通过大括号初始化列表语法初始化(即 { x, y }),因此以这种方式获得initializer_list参考需要多种情况的组合。