Можно ли использовать std:: string в constexpr?
С помощью C++11, Ubuntu 14.04, GCC по умолчанию toolchain.
этот код не выполняется:
constexpr std::string constString = "constString";
ошибка: тип ' const string {aka const std:: basic_string}' constString переменной функция constexpr ‘ - это не буквальный... потому что... 'std:: basic_string' имеет нетривиальный деструктор
можно использовать std::string
наconstexpr
? (очевидно, нет...) Если да, то как? Есть альтернативный способ использовать символьную строку в constexpr
?
3 ответа:
нет, и ваш компилятор уже дал вам исчерпывающее объяснение.
но вы могли бы сделать это:
constexpr char constString[] = "constString";
во время выполнения, это может быть использовано для построения
std::string
при необходимости.
в C++17, вы можете использовать
string_view
:constexpr std::string_view sv = "hello, world";
A
string_view
этоstring
-подобный объект, который действует как неизменяемая, не принадлежащая ссылка на любую последовательностьchar
объекты.
поскольку проблема является нетривиальным деструктором, поэтому, если деструктор удален из
std::string
, можно определить aconstexpr
экземпляр этого типа. Вот такstruct constexpr_str { char const* str; std::size_t size; // can only construct from a char[] literal template <std::size_t N> constexpr constexpr_str(char const (&s)[N]) : str(s) , size(N - 1) // not count the trailing nul {} }; int main() { constexpr constexpr_str s("constString"); // its .size is a constexpr std::array<int, s.size> a; return 0; }