我看到的大多数使用 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
而不是按值传递呢?
B b(std::move(values));
仍然可以编译。 - iavrconst
的,因此即使该列表被rvalue接收,也无法从中移动。 - Casey