是否可以在 constexpr 中使用 std::string ?

新手上路,请多包涵

_使用 C++11、Ubuntu 14.04、GCC 默认工具链_。

此代码失败:

 constexpr std::string constString = "constString";

错误:constexpr 变量 ‘constString’ 的类型 ‘const string {aka const std::basic_string}’ 不是字面量…因为… ‘std::basic_string’ 有一个非平凡的析构函数

是否可以在 std::string 中使用 constexpr ? (显然不是……)如果是这样,怎么办?是否有另一种方法可以在 constexpr 中使用字符串?

原文由 Vector 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 4.3k
2 个回答

不,你的编译器已经给你一个全面的解释。

但你可以这样做:

 constexpr char constString[] = "constString";

在运行时,这可用于在需要时构造一个 std::string

原文由 tenfour 发布,翻译遵循 CC BY-SA 4.0 许可协议

C++20 将添加 constexpr 字符串和向量

以下提案显然 已被接受http ://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0980r0.pdf 并添加了构造函数,例如:

 // 20.3.2.2, construct/copy/destroy
constexpr
basic_string() noexcept(noexcept(Allocator())) : basic_string(Allocator()) { }
constexpr
explicit basic_string(const Allocator& a) noexcept;
constexpr
basic_string(const basic_string& str);
constexpr
basic_string(basic_string&& str) noexcept;

除了所有/大多数方法的 constexpr 版本。

从 GCC 9.1.0 开始不支持,以下编译失败:

 #include <string>

int main() {
    constexpr std::string s("abc");
}

和:

 g++-9 -std=c++2a main.cpp

有错误:

 error: the type ‘const string’ {aka ‘const std::__cxx11::basic_string<char>’} of ‘constexpr’ variable ‘s’ is not literal

std::vector 讨论于: 无法创建 constexpr std::vector

在 Ubuntu 19.04 中测试。

原文由 Ciro Santilli OurBigBook.com 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题