initializer_list
assignabilitySection: 17.10 [support.initlist] Status: NAD Submitter: David Krauss Opened: 2014-09-30 Last modified: 2023-11-13
Priority: 2
View other active issues in [support.initlist].
View all other issues in [support.initlist].
View all issues with NAD status.
Discussion:
std::initializer_list::operator=
17.10 [support.initlist] is horribly broken and it needs deprecation:
std::initializer_list<foo> a = {{1}, {2}, {3}}; a = {{4}, {5}, {6}}; // New sequence is already destroyed.
Assignability of initializer_list
isn't explicitly specified, but most implementations supply a default assignment
operator. I'm not sure what 16.3 [description] says, but it probably doesn't matter.
[Lenexa 2015-05-05: Send to EWG as discussed in Telecon]
[2022-08-24; Reflector poll]
Set status to Tentatively NAD after reflector poll in October 2021.
"If somebody wants to revisit it, they'll need to write a paper to demonstrate what the change would break, whether that would be a problem in practice, and convince the evolution groups to make a change. But it's not an LWG issue."
[2022-11-25; see EWG 1369]
[2022-11-30 LWG telecon. Status changed: Tentatively NAD → NAD.]
[Varna 2023-06-12; EWG discussed the issue again]
EWG consensus: "Send LWG2432 back to LWG to encourage them to either add a note for their implementer to issue a warning as QoI, or to use the tools (explicit convertible_to operator=) at their disposal to accomplish their goal"
The operator=
suggestion refers to:
initializer_list& operator=(convertible_to<initializer_list> auto&& rhs) { /* ... */ }
initializer_list& operator=(initializer_list const&) requires false = default;
Proposed resolution:
Edit 17.10 [support.initlist] p1, class template initializer_list
synopsis, as indicated:
namespace std { template<class E> class initializer_list { public: […] constexpr initializer_list() noexcept; initializer_list(const initializer_list&) = default; initializer_list(initializer_list&&) = default; initializer_list& operator=(const initializer_list&) = delete; initializer_list& operator=(initializer_list&&) = delete; constexpr size_t size() const noexcept; […] }; […] }