Использование C ++ 11, Ubuntu 14.04, GCC по умолчанию .
Этот код не работает:
constexpr std::string constString = "constString";
ошибка: тип 'const string {aka const std :: basic_string}' переменной constexpr 'constString' не является литералом ... потому что ... 'std :: basic_string' имеет нетривиальный деструктор
Можно ли использовать std::string
в constexpr
? (очевидно нет ...) Если так, то как? Есть ли альтернативный способ использовать строку символов в constexpr
?
std::string
не буквальный типstd::string
быть constexpr? Есть несколько реализаций строк во время компиляции в SO. Какой смысл спрашивать, можно ли сделать constexpr не буквальным типом, если вы понимаете сообщение об ошибке и знаете, что можно сделать только литеральные типы constexpr? также есть несколько причин, по которым можно хотеть иметь экземпляр constexpr, поэтому я предлагаю вам уточнить ваш вопросconstexpr
реализации строк там.std::string
не один из них.Ответы:
Нет, и ваш компилятор уже дал вам исчерпывающее объяснение.
Но вы могли бы сделать это:
Во время выполнения это может быть использовано для создания,
std::string
когда это необходимо.источник
constexpr auto constString = "constString";
? Нет необходимости использовать этот уродливый синтаксис массива ;-)char[]
более подробный / понятный, чемauto
когда я пытаюсь подчеркнуть тип данных для использования.auto
;-)constexpr auto s = "c"sv;
связи с введениемstring_view
Начиная с C ++ 20 , да.
Начиная с C ++ 17 , вы можете использовать
string_view
:string_view
Являетсяstring
-каком объекта , который действует как неизменная, не-владеющему ссылка на любую последовательностьchar
объектов.источник
const std::string&
новую строку std :: string Обычно это противоположно тому, что вы имели в виду при создании константы. Поэтому я склонен говорить, что это не очень хорошая идея. По крайней мере, вы должны быть осторожны.string_view
не является неявно конвертируемым вstring
, поэтому существует небольшая опасность случайного создания astring
из astring_view
. С другой стороны ,char const*
это неявное преобразованиеstring
, поэтому использованиеstring_view
на самом деле безопаснее в этом смысле.string_view
не является неявно конвертируемымstring
. ИМО проблема, которую я поднял, все еще актуальна, но не относится кstring_view
конкретно. На самом деле, как вы упомянули, в этом отношении еще безопаснее.string_view
, что есть, а не просто ссылка.C ++ 20 добавит
constexpr
строки и векторыСледующее предложение было принято, по- видимому: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0980r0.pdf и добавляет конструкторы, такие как:
в дополнение к constexpr версиям всех / большинства методов.
Начиная с GCC 9.1.0, поддержка отсутствует, компилируется следующее:
с участием:
с ошибкой:
std::vector
обсуждается на: не может создать constexpr std :: vectorПроверено в Ubuntu 19.04.
источник
Поскольку проблема заключается в нетривиальном деструкторе, поэтому, если деструктор удаляется из
std::string
, можно определитьconstexpr
экземпляр этого типа. Как этоисточник
string_view
является, за исключением того, чтоstring_view
дает вам большую часть функциональных возможностей, которые вы знаете , изstd::string