我所看到的大部分C ++ 11代码都是std::initializer_list
的值,但它有时会被rvalue引用占用。有没有什么好理由这样做?
例如,我遇到的几乎所有例子都是这样的:
class A {
public:
A(std::initializer_list<int>);
};
但我偶尔会看到这件事:
class B {
public:
B(std::initializer_list<int> &&);
};
我理解rvalue引用的用法和目的,但为什么在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
?
答案 0 :(得分:7)
我不确定我是否有良好的原因,但我的猜测是代码的作者可能认为按值传递初始化列表会使元素的不必要副本列表。当然,这不是真的 - 复制初始化列表不会复制基础值。
答案 1 :(得分:4)
std::initializer_list
即使按值传递也会体现引用语义,因此通过引用传递最多会产生误导。 (它只包含非拥有指针。)
有通用引用绑定到任何东西,但它们不能通过 braced-init-list 语法(即{ x, y }
)初始化,因此获得initializer_list
引用这种方式会综合考虑因素。