为什么 std::wstring().capacity() 的 constexpr 不等于 std::wstring().capacity()?

Mar*_*urg 13 c++ stl visual-c++ constexpr visual-studio-2022

我不确定我是否太na\xc3\xafve 或者只是太无知。

\n

但为什么下面的内容有所不同呢?

\n
constexpr auto nInitialCapacity1 = std::wstring().capacity();\nconst auto     nInitialCapacity2 = std::wstring().capacity();\n
Run Code Online (Sandbox Code Playgroud)\n

在 Visual Studio 2022/17.0.5 中,上述代码导致:

\n
nInitialCapacity1 = 8\nnInitialCapacity2 = 7\n
Run Code Online (Sandbox Code Playgroud)\n

为什么(编译时)版本的结果constexpr不等于const调用的版本?

\n

感谢您的任何解释!

\n

Art*_*yer 21

Microsoft 的 STL在常量计算上下文中禁用短字符串优化,因此它改为分配内存。

分配始终大于 2 的幂,因此容量(不包括最后一个L'\0')始终是 2 的幂。

在非常量求值版本中,短字符串缓冲区可以容纳 8 个字符,其中一个是 a L'\0',因此容量为 7。