我一直很愉快地在我的代码中使用以下风格的常量字符串字面值,但并没有真正理解它是如何工作的:
constexpr std::array myStrings = { "one", "two", "three" };
这可能看起来很琐碎,但我对底层发生的细节不够清楚。据我理解,类模板参数推导(CTAD)用于构造具有适当大小和元素类型的数组。我的问题是:
- 在这种情况下,std::array的元素类型是什么,还是这是特定于实现的?查看调试器(我正在使用Microsoft C ++),元素只是指向非连续位置的指针。
- 以这种方式声明字符串字面量的constexpr数组是否安全?
我可以选择做如下操作,但它不太整洁:
const std::array<std::string, 3> myOtherStrings = { "one", "two", "three" };
operator""s
用于std::string
自C++20起已成为constexpr
,因此假定可以在新的编译器中使用constexpr
。或者自C++17起,他们可以使用sv
后缀使所有它们成为std::string_view
字面值(从一开始就是constexpr
)。 - ShadowRangerstd::string
,因此constexpr
仍然无法工作。std::string_view
/sv
将作为一种替代方案,类似于添加大小信息的const char *
,并且可以是constexpr
。 - user17732522constexpr
,而且std::string
似乎不太适合一般情况下工作,考虑到数据的内在运行时特性,忽略SSO)。但是,在实际代码中,只要用户不降到NUL终止的C风格字符串级别,我就给所有东西加上sv
前缀;为什么要让使用它的每个东西都计算长度(或者在遍历字符串时重复检查NUL),当您可以在编译时将长度烘焙并避免每个运行时的strlen
检查呢? - ShadowRanger