Прежде всего, я предполагаю, что в 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
constexpr std::string s{"Hallo"};
не будет компилироваться с gcc gcc.godbolt.org/z/hWdPE7 - person Ayxan Haqverdili   schedule 11.07.2020std::allocator::allocate
есть интересный момент: По порядку чтобы использовать эту функцию в постоянном выражении, выделенное хранилище должно быть освобождено при вычислении того же выражения. Таким образом, выделения времени компиляции должны быть освобождены во время компиляции. Я не уверен, чтоstd::string
должен иметьconstexpr
в своих методах, но из-за этого в данном случае это, вероятно, не поможет. - person HolyBlackCat   schedule 11.07.2020