Большая часть кода С++ 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
по ссылке rvalue вместо значения?