可以在constexpr中使用std :: string吗?

使用C ++ 11,Ubuntu 14.04,GCC默认工具链

此代码失败:

constexpr std::string constString = "constString"; 

错误:constexprvariables'constString'的types'const string {aka const std :: basic_string}'不是文字…因为…'std :: basic_string'有一个非平凡的析构函数

可以在constexpr使用std::string吗? (显然不是…)如果是这样,怎么样? 在constexpr有没有其他的方法来使用string?

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

但是你可以这样做:

 constexpr char constString[] = "constString"; 

在运行时,这可以用来在需要的时候构造一个std :: string。

在C ++ 17中,你可以使用string_view

 using namespace std::string_view_literals; constexpr std::string_view sv = "hello, world"sv; 

由于问题是非平凡的析构函数,因此如果析构函数从std::string被移除,那么可以定义该types的constexpr实例。 喜欢这个

 struct constexpr_str { char const* str; std::size_t size; // can only construct from a char[] literal template <std::size_t N> constexpr constexpr_str(char const (&s)[N]) : str(s) , size(N - 1) // not count the trailing nul {} }; int main() { constexpr constexpr_str s("constString"); // its .size is a constexpr std::array<int, s.size> a; return 0; }