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

Why is constexpr of std::wstring().capacity() not equal to std::wstring().capacity()?

我不确定我是太天真了还是太无知了。

但为什么以下内容不同?

constexpr auto nInitialCapacity1 = std::wstring().capacity();
const auto     nInitialCapacity2 = std::wstring().capacity();

在 Visual Studio 2022/17.0.5 上面的代码导致:

nInitialCapacity1 = 8
nInitialCapacity2 = 7

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

感谢任何解释!

Microsoft 的 STL disables short string optimisation in constant evaluated contexts,因此它分配内存。

分配总是大于 2 的幂,因此容量(不包括最后一个 L'[=10=]')总是 2 的幂。

在non-constant-evaluated版本中,短字符串缓冲区可以容纳8个字符,其中一个是L'[=10=]',所以容量是7。

根据新的经验和观察更新:

  • 反汇编的内容window显示,const-callto std::wstring::capacity的结果是8!
  • 但是手表 window 和变量的工具提示显示 7.

同事的假设是,调试器调用constexpr方法capacitynon-const,得到7的不同结果并可视化。

调查反汇编的一个原因 window 是以下代码中的意外行为:

const auto nInitCap = std::wstring().capacity();
const auto nCap     = str.capacity();

if (nCap != nInitCap)
    std::wcout << "capacity " << nCap << "is not equal to the initial capacity " << nInitCap << std::endl;

if (nCap > nInitCap)
    std::wcout << "capacity " << nCap << "is greater than the initial capacity " << nInitCap << std::endl;

调试器显示变量:

nInitCap: 7
nCap:     7

但是打印出来的代码:

capacity 7 is not equal to the initial capacity 7

对const-constructed临时对象returns8的容量调用,正如在反汇编中看到的那样,所以行为是可以解释的,即使VS2022 17.0.5的调试器显示7