Home >Backend Development >C++ >Can You Move Elements Out of a std::initializer_list?
Initializer Lists and Move Semantics: Can I Move Elements Out?
A question arises regarding the usage of initializer lists and move semantics: is it permissible to move elements out of a std::initializer_list
The Problem
Consider the following code snippet:
#include <initializer_list> #include <utility> template<typename T> void foo(std::initializer_list<T> list) { for (auto it = list.begin(); it != list.end(); ++it) { bar(std::move(*it)); // kosher? } }
Here, we want to check if it's possible to move elements out of a std::initializer_list.
The Answer
Surprisingly, the answer is no. The expression std::move(*it) will not result in a move. Instead, it produces an immutable rvalue reference of type T const &&. This is because initializer_list's begin and end methods return const T *, which doesn't allow for move semantics.
The likely reason for this is to enable the compiler to create initializer_list as a statically-initialized constant. However, it would be more intuitive to have begin and end return either initializer_list or const initializer_list, depending on the compiler's discretion.
Further Considerations
An ISO proposal has been made to provide initializer_list support for move-only types. This proposal, though still in its early stages, addresses the issue raised here.
The above is the detailed content of Can You Move Elements Out of a std::initializer_list?. For more information, please follow other related articles on the PHP Chinese website!