如何声明constexpr C字符串?

时间:2017-09-07 15:36:13

标签: c++ constexpr c-strings string-literals

我想我完全理解如何将关键字constexpr用于简单的变量类型,但是当涉及指向值的指针时,我感到很困惑。

我想声明一个constexpr C字符串文字,其行为类似于

#define my_str "hello"

这意味着编译器将C字符串文字插入到我输入此符号的每个位置,并且我将能够在编译时使用sizeof获取其长度。

constexpr char * const my_str = "hello";

const char * constexpr my_str = "hello";

constexpr char my_str [] = "hello";

或其他不同的东西?

2 个答案:

答案 0 :(得分:16)

  

constexpr char * const my_str = "hello";

不,因为字符串文字不能转换为指向char指针。 (它曾经在C ++ 11之前,但即使这样,转换也被弃用了。)

  

const char * constexpr my_str = "hello";

没有。 constexpr不能去那里。

这将很好地形成:

constexpr const char * my_str = "hello";

但它并不满足于此:

  

这样我就可以在编译时使用sizeof等获得它的长度。

  

constexpr char my_str [] = "hello";

这个格式很好,你确实可以在sizeof的编译时获得长度。请注意,此大小是数组的大小,而不是字符串的长度,即大小包括空终止符。

答案 1 :(得分:15)

C++17中,您可以使用std::string_viewstring_view_literals

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

然后,

my_str.size()是编译时常量。