1

I want to make a small library of my own containers without relying on STL at all, as a form of exercise. How can I define an initializer list constructor for my classes without std::initializer_list? How is it even implemented?

10
  • 1
    Long story short - you can't. std::vector couldn't, you can't do it general case either. There is a reason why std::initializer_list exists. Commented Mar 9, 2020 at 17:18
  • Well that sucks Commented Mar 9, 2020 at 17:19
  • Because of the way the was the language works { stuff } doesn't actually have a type. It takes the compiler to do some "magic" to turn that braced-init-list into a std::initializer_list. You would have to make your own compiler to provide your own "magic". Commented Mar 9, 2020 at 17:20
  • Does this answer your question? Implementation of std::initializer_list Commented Mar 9, 2020 at 17:23
  • 1
    <initializer_list> is guaranteed to be available on freestanding implementations, so there is no reason to avoid it. Commented Mar 9, 2020 at 17:23

1 Answer 1

3

How can I define an initializer list constructor for my classes without std::initializer_list?

You don't. The very definition of "initializer list constructor" is tied into std::initializer_list. Just like the result of typeid is tied directly into std::type_info, and the result of sizeof and alignof is a std::size_t.

Attempting to use C++ while pretending the standard library in its entirety does not exist is folly. There are parts of it you can ignore without consequence, but if you want to have an "initializer list constructor", you have to use std::initializer_list.

The C++ standard library is not optional; it is not divorced from C++ as a langauge. Parts of it are, but std::initializer_list isn't one of those parts.

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

7 Comments

Why did they have to invent something called initalizer_list instead of reusing std::vector or std::array? Something like { 1, 2, 3 } means std::vector<int> which contains 1, 2 and 3?
@Ayxan because std::vector<int> implies dynamic allocation, and std::array<int, 3> ties the number of elements into the type. std::initalizer_list is a temporary with unspecified size
@Ayxan: std::initializer_list is just a pair of pointers. The temporary it refers to is a temporary.
@Ayxan: It's a temporary array. The array follows the rules of temporaries.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.