7

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?

10
  • 8
    Why did I just imagine my 8-year old son machine-gunning me with questions about the sky being blue, where chocolate milk comes from, what gravity is... Commented Jul 12, 2013 at 20:03
  • 3
    @JohnDibling: Does your 8-year old son have a Stack Overflow account? No, you say? Are you sure? Commented Jul 12, 2013 at 20:06
  • 7
    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. It's only use is, at it name implies, to initialize objects. I think it was designed to be a lighter template than things like vector or tuple. Commented Jul 12, 2013 at 20:06
  • 2
    @JohnDibling Your metaphor is accurate:) I'm like the rooky asking the gods of c++ why they choose do so Commented Jul 12, 2013 at 20:08
  • 4
    @thb: Questions about minecraft and yu gi oh are off-topic at stack overflow, so I doubt it. :) Commented Jul 12, 2013 at 20:10

1 Answer 1

3

From section 18.9 of the C++ Standard:

An object of type initializer_list provides access to an array of objects of type const E. [ Note: A pair of pointers or a pointer plus a length would be obvious representations for initializer_list. initializer_list is used to implement initializer lists as specified in 8.5.4. Copying an initializer list does not copy the underlying elements. — end note ]

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.

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.