Использование лямбда-функции в конструкторе constexpr с std::tieC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Использование лямбда-функции в конструкторе constexpr с std::tie

Сообщение Anonymous »

Я пытаюсь использовать конструктор constexpr в C++17 с лямбдой, которая использует std::tie для инициализации полей в классе из кортежа.
Код похож на этот :

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

#include 

enum class Format {
UINT8,
UINT16
};

struct FormatInfo {
const char* name = nullptr;
int maxVal = 0;

constexpr explicit FormatInfo(Format fmt) {
auto set = [this](const auto&... args) constexpr {
std::tie(name, maxVal) = std::make_tuple(args...);
};

switch(fmt) {
case Format::UINT8:  set("uint8", 255); break;
case Format::UINT16: set("uint16", 65535); break;
}
}
};

int main() {
FormatInfo info(Format::UINT8); // ok
constexpr FormatInfo info2(Format::UINT8); // fails
}
Вызов конструктора как constexpr завершается неудачно, с ошибкой, связанной с вызовом функции, отличной от constexpr, внутри set. Хотя и std::tie, и std::make_tuple должны быть constexpr.
Создание самой лямбды constexpr (

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

constexpr auto set = ...
) также завершается с ошибкой, что это не является постоянным выражением.
Есть ли способ заставить это работать в C++17?

Подробнее здесь: https://stackoverflow.com/questions/782 ... ith-stdtie
Ответить

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

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

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

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

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