我想我很理解如何将关键字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";
还是别的什么
3条答案
按热度按时间9ceoxa921#
是
constexpr char * const my_str = "hello";
吗不能,因为字符串文字不能转换为指向
char
* 的 * 指针。(它曾经在C++11之前,但即使在那时,转换也被弃用)。或
const char * constexpr my_str = "hello";
不,
constexpr
不能去那里。这将是良好的形式:
但它并不能满足这一点:
这样我就可以在编译时用sizeof等得到它的长度
或
constexpr char my_str [] = "hello";
这是格式良好的,您确实可以在编译时使用
sizeof
获得长度。注意,这个大小是数组的大小,而不是字符串的长度。该大小包括空终止符。c0vxltue2#
在C++17中,可以使用
std::string_view
和string_view_literals
然后
my_str.size()
是编译时间常数。fgw7neuy3#
C++11
由于
constexpr const char*
字符串字面量的空终止,您可以简单地使用std::strlen,如果它应该在编译时工作,则可以轻松定义自定义函数:(C++11 constexpr函数只能包含exactly one return statement,所以使用递归。
如果
sizeof
必须 * 另外 * 像在数组上一样工作(即包含了null-termination),你可以使用variadic templates来定义字符串字面量,如下所示:使用output:
这可能看起来有点过分,因为可以简单地使用一个数组,如
但是
char_string
类型可以被扩展以支持所有可能的constexpr字符串特征,并且通过使用::param_pack
是特别灵活的,这在例如w.r.t.编译时string concatenation。