можно ли теперь использовать std::string как константу времени компиляции?

Прежде всего, я предполагаю, что в C++20 у нас есть constexpr std::string в C++20. Если это так, то должна быть возможность написать что-то вроде:

struct MyType { constexpr MyType(int n_):n{n_}{}; int n; };

template < auto a > struct Something {};
template <> struct Something< MyType{1} > { void Do() { std::cout << "Special One" << std::endl;} };
template <> struct Something< MyType{2} > { void Do() { std::cout << "Super Two" << std::endl;} };


int main()
{
    Something<MyType{1}> s; // works fine as expected
    s.Do();

    Something< std::string("Hallo")> s2; // did not work. See error message below
}

Но gcc 10.1 жалуется, что std::string не является буквальным типом, потому что деструктор не constexpr. Но если я правильно понимаю текущий стандарт, std::string должен быть полностью constexpr.

Я не прав? Или текущая STL от gcc не готова к C++20?

Полное сообщение об ошибке от gcc 10.1 (то же самое с текущим стволом g++).

/usr/include/c++/10/bits/basic_string.h:77:11: note: 'std::__cxx11::basic_string<char>' is  not literal because:
   77 |     class basic_string
      |           ^~~~~~~~~~~~
/usr/include/c++/10/bits/basic_string.h:77:11: note:   'std::__cxx11::basic_string<char>' does not have 'constexpr' destructor

person Klaus    schedule 11.07.2020    source источник
comment
Да, нет. Посмотрите на en.cppreference.com/w/cpp/string/basic_string и поиск С++ 20   -  person sehe    schedule 11.07.2020
comment
@sehe Не могу понять вашу точку зрения ... Я не вижу ни конструктора, ни деструктора с тегом c ++ 20. Но cppreference не является стандартом и, возможно, не актуален. Но связанный p0980r1.pdf говорит нам, что все это constexpr...   -  person Klaus    schedule 11.07.2020
comment
constexpr std::string s{"Hallo"}; не будет компилироваться с gcc gcc.godbolt.org/z/hWdPE7   -  person Ayxan Haqverdili    schedule 11.07.2020
comment
Многие компиляторы не полностью обновлены, хотя в них есть C++20.   -  person QuentinUK    schedule 11.07.2020
comment
На странице Cppreference на std::allocator::allocate есть интересный момент: По порядку чтобы использовать эту функцию в постоянном выражении, выделенное хранилище должно быть освобождено при вычислении того же выражения. Таким образом, выделения времени компиляции должны быть освобождены во время компиляции. Я не уверен, что std::string должен иметь constexpr в своих методах, но из-за этого в данном случае это, вероятно, не поможет.   -  person HolyBlackCat    schedule 11.07.2020
comment
@QuentinUK: Совершенно ясно, рано его использовать. Я только хочу знать, должно ли это работать. Если он сейчас не работает, это не мой вопрос, я это видел :-)   -  person Klaus    schedule 11.07.2020
comment
@HolyBlackCat действительно. Благодаря встраиванию, escape-анализу и §18.6.1.1/2 реализации разрешено опускать вызов заменяемой глобальной функции распределения. Так что вам может не понадобиться constexpr в первую очередь.   -  person sehe    schedule 11.07.2020