I have some questions regarding the design of std::initializer_list
.
I didn't find answers in [support.initlist].
Why does it have an explicitly defined default constructor?
Why this constructor is not constexpr
?
Why the method size()
is not constexpr
?
Why there's no traits giving the size of initializer_list
(like specializing std::tuple_size
)?
Why it's not possible to statically access its elements (like specializing std::get
)?
What happens when sizeof
is applied to initializer_list
?
From section 18.9 of the C++ Standard:
I think the reason for most of these things is that std::initializer_list isn't actually a container. It doesn't have value semantics, it has pointer semantics. Which is made obvious by the last portion of the quote: Copying an initializer list does not copy the underlying elements. Seeing as they were intended solely for the purpose of initializing things, I don't think it's that surprising that you don't get all the niceties of more robust containers such as tuples.