Почему std::initializer_list теряет свою constexpr'ность при передаче функции? [дубликат]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему std::initializer_list теряет свою constexpr'ность при передаче функции? [дубликат]

Сообщение Anonymous »

Насколько мне известно, передача объекта в функцию не должна (на самом деле я не знаю, почему иногда это происходит или нет) приводить к потере этого объекта статуса constexpr:

Код: Выделить всё

#include 
#include 

template
void func(std::initializer_list list) {

// std::initializer_list loses constexpr status
static constexpr int N = list.size();
// N must be initialized with a constant

}

struct MyConstExprClass
{
constexpr int size() const { return 0;}
};

void func2(MyConstExprClass g)
{
/* MY CLASS DOESN'T LOSE ITS constexpr'ness */
constexpr int N = g.size();
}

int main()
{
//func( { 1, 2, 3} ); // THIS DOESN'T COMPILE ON ANY COMPILER

func2(MyConstExprClass{}); // THIS COMPILES ON ALL COMPILERS

// THE FOLLOWING COMPILES ON ALL COMPILERS
static_assert(std::initializer_list{1, 2, 3}.size() == 3);

}
Ссылка на godbolt
Почему std::initializer_list теряет свой статус constexpr? И происходит ли это с другими классами? И что отличает такой класс от моего класса MyConstExprClass, который его сохранил?

Подробнее здесь: https://stackoverflow.com/questions/798 ... a-function
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»