【发布时间】:2015-05-29 02:29:10
【问题描述】:
C-Strings 或std::strings 可以创建为constexpr 还是必须在运行时创建?
使用 gcc 4.9.2 我可以这样做:
constexpr const char foo[] = "blee";
(遗憾的是,2013 年 11 月的客户技术预览版不允许 Visual Studio 支持此功能:https://stackoverflow.com/a/29255013/2642059)
但即使使用 gcc 4.9.2 我也不能这样做:
constexpr const std::string foo = "blee";
我得到错误:
error: the type 'const string {aka const std::basic_string<char>}' of constexpr variable 'foo'
is not literal
constexpr const std::string foo = "blee";
^
note: 'std::basic_string<char>' is not literal because:
class basic_string
^
note: 'std::basic_string<char>' has a non-trivial destructor
但我想进一步澄清为什么 std::string 不是文字。也就是说:为什么一定要在运行时构造字符串?
正如所指出的,这个问题可以部分回答:Is it possible to use std::string in a constexpr?,但它没有涉及为什么std::string 不能是问题核心的文字。
【问题讨论】:
-
我认为原因在另一个答案中给出:因为'std::basic_string'有一个非平凡的析构函数。
-
这两个概念是无关的。您实际上是在询问
std::string是否是文字类型。不是。 -
您还遗漏了错误消息的重要部分:“... 'std::basic_string
' 不是文字,因为: ... 'std::basic_string '有一个非平凡的析构函数”,这使得它成为另一个问题的重复。 -
显而易见的答案是它需要调用
operator new,这作为编译时操作实际上没有意义。堆可能甚至还没有构建,等等。 -
这个问题有什么依据吗?这似乎是一个 XY 问题。
标签: c++ c++11 literals stdstring constexpr