Можно ли использовать 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 96

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, можно определить a constexpr экземпляр этого типа. Вот так

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;
}