包含 std::string 编译器错误的向量的 Constexpr

问题描述 投票:0回答:1

我对下面的代码感到非常困惑。了解此代码确实在 Visual Studio 2022 C++ 20 (/std:c++20) 版本 (17.10.6) 上编译。 这个问题不是以下问题的重复:为什么我可以定义一个 constinit 的 std::string 实例?如果对象需要动态初始化,constinit不是被禁止了吗?

#include <cstdint>
#include <string>
#include <vector>
#include <utility>
#include <iostream>

class AppData
{
    public:
        static inline const std::wstring APPLICATION_TITLE = L"Test\n";
        static inline constexpr std::vector<std::pair<uint32_t, std::wstring>> APP_TITLE_FMT{ { 0, L"\x1b[1mHello" }, { 4, L"\x1b[0mHello" } };
};

int main(int argc, char** argv)
{
    std::wcout << AppData::APP_TITLE_FMT.at(0).second.c_str() << std::endl;
    return 0;
}

据我了解, std::string 不能是 constexpr,因为它的堆已分配,并且只有在求值期间被破坏时才可以是 constexpr。然而,我读到在 C++ 20 中,他们将制作 std::vector constexpr 所以我想我会尝试一下。

拿上面的代码来说,std::wstring显然不能是constexpr,除非你把它做成一个数组,但我特别需要一个字符串。第二行是一个对向量,其中对的类型之一是 wstring。那么这怎么可能是 constexpr 呢? 有人建议这可能是 SSO。

现在我使用的是 Visual Studio 2022 (17.10.6),所以这可能是 Microsoft 编译器错误,但 Intellisense 说,不,但编译器说,是的,它完全没问题,编译时没有错误或警告。

需要明确的是,我还没有尝试过这是 Godbolt,所以也许它可以在那里工作,也许不能...但是这段代码DOES可以在使用 C++ 20 的 Visual Studio 2022 上完全正确编译。

这是一个实际的编译器错误吗?

c++ vector constexpr
1个回答
0
投票

这是一个实际的编译器错误吗?

是的,但它已被修复,并且自 VS 17.10 以来已经发布了多个版本,因此升级您的 Visual Studio 2022,它会给您预期的错误:

error C2131: expression did not evaluate to a constant
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.