В настоящее время я пытаюсь использовать constexpr
для определения некоторых входных средств идентификации:
struct RangeParams {
string legacyId;
string fullname;
string shortname;
float min = -1;
float baseline = 0;
float max = 1;
float defaultValue = 0;
};
...
inline constexpr RangeParams curve1 = { "some_id", "my_name", ...};
К сожалению, я получаю сообщение об ошибке для строки constexpr, говорящее
Constexprпеременная не может иметь не-литеральный тип 'const RangeParams'
Итак, я покопался в ней, чтобы выяснить, какая часть этого не-литерала, и string
был виновником.
std::cout << std::is_literal_type<float>::value; // output: 1
std::cout << std::is_literal_type<string>::value; // output: 0
Обнаружение этого выдвинуло на первый план для меня важный факт, который заключается в том, что мое понимание литеральных типов довольно ошибочно.По большей части я просто думал о них как об основах (числах, строках, логических значениях, структурах, созданных из этих вещей).
Так почему бы простой строке не быть буквальным типом?Что здесь за недочеты?
Кроме того, как я могу обойти это?Я пытаюсь сделать глобальную из моих RangeParams, и самый современный ответ на этот вопрос ( Определение глобальной константы в C ++ ), похоже, не работает.