questions regarding the design of std::initializer

2020-02-28 14:48发布

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?

标签: c++ c++11
1条回答
【Aperson】
2楼-- · 2020-02-28 15:41

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.

查看更多
登录 后发表回答