评估在编译时不满意?

ana*_*lyg 4 c++ language-lawyer constexpr

如果我的代码包含此constexpr字符串

constexpr char my_str[] = "hello";
Run Code Online (Sandbox Code Playgroud)

my_str包含有关其大小的信息的类型,即sizeof(my_str)常量6,可以在需要常量的任何地方使用。

strlen(my_str)呢 是否可以/也应该将其评估为编译时常数?

这是yes的示例:https : //ideone.com/2U65bN

这是一个没有的示例:http : //coliru.stacked-crooked.com/a/8cb094776dfc5969

标准对此有何看法?当然不是“也许”吗?

eye*_*ash 7

在C ++ 17可以使用std::char_traits::length,这是constexpr不是,strlen


Nir*_*man 3

21.8、1和2,在标准中说:

  1. 表 74、75、76、77、78 和 79 分别描述了标头<cctype><cwctype><cstring><cwchar><cstdlib> (字符转换)和<cuchar>

  2. 这些头文件的内容应分别与标准 C 库头文件<ctype.h><wctype.h><string.h><wchar.h><stdlib.h>和 C Unicode TR 头文件相同<uchar.h>,并进行以下修改:

strlen在c++中定义<cstring>。后面的修改不再提及strlen。由此,我得出结论,C++ 中的签名必须与 C 中的签名完全相同,并且由于 C 没有constexpr,因此它在技术上是不合规的。也就是说,这是不合规的事情之一,除了在一个平台上依赖它然后在另一个平台上找不到它之外,不太可能造成任何损害。