Почему std :: is_literal_type== ложь и как я могу обойти это? - PullRequest
0 голосов
/ 21 февраля 2019

В настоящее время я пытаюсь использовать 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 ++ ), похоже, не работает.

1 Ответ

0 голосов
/ 21 февраля 2019

std::string не является буквальным.const char[] есть.Суть в том, что std::string - это контейнер динамического размера.Нет, вы не можете обойти это и по-прежнему использовать std::string.std::string невозможно использовать в контексте constexpr.

Возможно, вы захотите заменить std::string на const char* в своем коде:

struct RangeParams {
    const char* legacyId;
    const char* fullname;
    const char* shortname;
    float min = -1; 
    float baseline = 0;
    float max = 1;
    float defaultValue = 0;
};

Это не совсем то же самое, но с учетом отсутствияС точки зрения контекста, трудно обосновать, для чего именно вам нужен std::string, поэтому сомнительно, что const char* будет подходящей альтернативой.

РЕДАКТИРОВАТЬ: короткий пример должен помочь понять неправильное представление.Какой тип 0 ?.Это int.Какой тип 'a'?Это char.Какой тип "abc"?Это не std::string, это const char[4]!

...