Почему std::initializer_list не поддерживает std::get‹›, std::tuple_size и std::tuple_element

Почему std::initializer_list не поддерживает std::get<>, std::tuple_size и std::tuple_element? Он часто используется в выражениях constexpr, как сейчас, например,

std::max({1, 2, 3, 4, 5});

И если бы это было круто, то было бы возможно следующее

auto [x, y] = {1, 2};

Так почему же std::initializer_list не поддерживает их? Насколько мне известно, нет возможности построить std::initializer_list во время выполнения, поэтому размер всегда фиксируется пользователем.


Ниже приведен пример того, как можно получить размер std::intializer_list<> во время компиляции.

#include <iostream>
#include <initializer_list>

using std::cout;
using std::endl;

template <typename...>  struct WhichType;

template <typename Type>
constexpr int size_init_list(std::initializer_list<Type> il) {
    return il.end() - il.begin();
}

int main() {
    constexpr auto size = size_init_list({1, 2, 3});
    cout << static_cast<int>(std::integral_constant<int, size>{}) << endl;
    return 0;
}

person Curious    schedule 21.06.2017    source источник
comment
@downvoter, почему минус?   -  person Curious    schedule 21.06.2017
comment
авто i = randint(0,1) ? std::initializer_list‹int›{1, 2} : std::initializer_list‹int›{1, 2, 3, 4, 5, 6, 7};   -  person cpplearner    schedule 21.06.2017
comment
Почему бы просто не закончить - начать?   -  person kamikaze    schedule 21.06.2017


Ответы (1)


Несмотря на то, что размер std::initializer_list является константой времени компиляции, он не является частью типа. Каждый список инициализаторов ints имеет один и тот же тип, а именно std::initializer_list<int>. И std::tuple_size<std::initializer_list<int>>::value может иметь только одно возможное значение. Поэтому очевидно, что его нельзя использовать для получения фактического размера списка инициализаторов. Нет смысла его определять вообще.

person Brian Bi    schedule 21.06.2017
comment
Обновил мой вопрос - person Curious; 21.06.2017
comment
@ Любопытно, да, вы можете получить размер во время компиляции, но это не значит, что std::tuple_size может это сделать. В своем ответе я объяснил, почему: дается только тип, а не экземпляр. - person Brian Bi; 21.06.2017
comment
Глупый вопрос с моей стороны. - person Curious; 21.06.2017