Maybe this clause from 8.5.4.5 explains it (my emphasis):
An object of type std::initializer_list is constructed from an
initializer list as if the implementation allocated an array of N
elements of type E, where N is the number of elements in the
initializer list. Each element of that array is copy-initialized
with the corresponding element of the initializer list, and the
std::initializer_list object is constructed to refer to that array.
So you can only initialize from lists if the objects are copyable.
Update: As Johannes points out, copy-initialization can be realized by both copy and move constructors, so that alone isn’t enough to answer the question. Here is, however, an excerpt of the specification of the initializer_list
class as described in 18.9:
template<class _E>
class initializer_list
{
public:
typedef _E value_type;
typedef const _E& reference;
typedef const _E& const_reference;
typedef size_t size_type;
typedef const _E* iterator;
typedef const _E* const_iterator;
Note how there are no non-constant typedefs!
I just tried making an IL constructor which would traverse the initializer list via std::make_move_iterator
, which failed because const T &
cannot be converted to T&&
.
So the answer is: You cannot move from the IL, because the standard says so.