为什么要采用 std::initializer_list 按右值引用与按值
Why take a std::initializer_list by rvalue reference vs. by value?
我见过的大多数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
参考需要多种情况的组合。
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- 如何在 C 中正确使用 libiconv 使其不会报告"Arg list too long"?
- 通过引用从 std::list 中删除元素
- 如何管理 std::list 元素作为引用
- CPP 对 std::list 中指针的引用
- 将 std::list<std::unique_ptr> 移动到向量中会尝试引用已删除的函数
- 我可以在 std::list 中移动元素而不会使迭代器或引用无效,但是如何移动呢?
- 对'list'的引用含糊不清
- List Traversal w/temp指针-在声明指针时分配指针引用的节点空间有危险
- boost::python传递对python::list的引用
- 为什么 vector<> 和 list<> 容器中的push_back不返回对插入元素的引用?
- 从迭代器返回一个std::list元素的引用
- 是否可以将对 std::list<int*> 的引用转换为对 std::list<const int*> 的引用?