c++ - 为什么要通过右值引用而不是按值来获取 std::initializer_list?

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

我见过的大多数采用 std::initializer_list 的 C++11 代码都按值采用它,但有时它采用右值引用。这样做有什么好的理由吗?

例如,我遇到的几乎每个例子都是这样的:

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

最佳答案

我不确定我有一个的理由,但我的猜测是代码的作者可能认为按值传递初始化列表会导致不必要的元素拷贝名单。当然,这不是真的 - 复制初始化列表不会复制基础值。

关于c++ - 为什么要通过右值引用而不是按值来获取 std::initializer_list?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21868232/

相关文章:

c++ - 返回时如何避免复制

c++ - 为什么未导出的函数名称仍列在 MinGW DLL 中?

c++ - 类型错误和指针混淆

c++ - 非静态数据成员初始化器问题

c++ - std::regex 和双 ABI

c++ - thread_local std::list 是否在调用 clear 时放弃分配的内存?

c++ - 具有临时子表达式的临时对象的生命周期,绑定(bind)到一个引用

c++ - 在参数构造中使用 std::move

c++ - Android Studio C++ <list> begin()/end() 无匹配函数[可能是 cmake 问题]

c++ - 在 std::shared_ptr 中使用 = 运算符时,先前的指针是否被破坏?