【发布时间】:2022-02-01 19:14:15
【问题描述】:
我不确定我是太天真还是太不了解。
但是为什么以下不同呢?
constexpr auto nInitialCapacity1 = std::wstring().capacity();
const auto nInitialCapacity2 = std::wstring().capacity();
在 Visual Studio 2022/17.0.5 中,上面的代码导致:
nInitialCapacity1 = 8
nInitialCapacity2 = 7
为什么constexpr(编译时)版本的结果不等于const版本的调用?
感谢您的解释!
【问题讨论】:
-
我看不出标准库需要在运行时和编译时以同样的方式实现这一点的任何理由。无论如何,默认构造的字符串的容量取决于实现。
-
@user17732522 你说的很对。所有具体实现!但是为什么编译时版本应该与其他版本不同呢?无论如何,实现将返回什么数字,我个人希望得到相同的结果。
-
也许他们不能以通常的方式进行 SSO,因为无法在常量表达式中重新键入内存,尽管基于联合的实现也应该在常量表达式中工作。
-
constexpr auto nInitialCapacity1 = std::wstring().capacity();不适用于Clang或GCC与-std=c++20或-std=c++2a。error: constexpr variable 'nInitialCapacity1' must be initialized by a constant expression -
@Brandon add
-std=c++20and works fine.
标签: c++ visual-c++ stl constexpr visual-studio-2022