我见过的大多数采用 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/