Visual Studio 2019编译器错误C2397和警告C4838:缩小转换诊断

ymdaylpp  于 2023-04-07  发布在  其他
关注(0)|答案(1)|浏览(511)

在Visual Studio 2019中,以下代码生成编译器错误C2397:

conversion from 'T' to 'size_t' requires a narrowing conversion.
struct Narrow
{
    template <typename T>
    Narrow(T t)
        : szt{ t }
    { }

    std::size_t szt[1];
};

Narrow narrow{ 3 };

相反,下面的代码会产生警告

(level 1) C4838: "conversion from 'T' to 'size_t' requires a narrowing conversion".
struct Narrow
{
    template <typename T>
    Narrow(T t)
    {
        std::size_t arr[] { t };
    }
};

Narrow narrow{ 3 };

我发现这种行为不一致。我知道有一个收缩转换和C++标准需要一个诊断消息,但这些例子之间有什么不同,第一个是错误,而第二个只是一个警告?

6yt4nkrj

6yt4nkrj1#

这是向后兼容性的不同行为。
T t{v}在C11之前是无效的代码。T t = {v}在C11之前是有效的代码,并且可以产生有关缩小对话的警告。
T t{v}是C11以来的有效代码,可能会产生缩小转换的错误。这是符合标准C11的新行为。它不能破坏旧代码,因为这是一个新的初始化语法。
T t = {v}中保留了关于收缩对话的警告是为了向后兼容。否则,如果使用C11编译器编译,它将破坏先前成功编译的C98代码。

相关问题