在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++标准需要一个诊断消息,但这些例子之间有什么不同,第一个是错误,而第二个只是一个警告?
1条答案
按热度按时间6yt4nkrj1#
这是向后兼容性的不同行为。
T t{v}
在C11之前是无效的代码。T t = {v}
在C11之前是有效的代码,并且可以产生有关缩小对话的警告。T t{v}
是C11以来的有效代码,可能会产生缩小转换的错误。这是符合标准C11的新行为。它不能破坏旧代码,因为这是一个新的初始化语法。在
T t = {v}
中保留了关于收缩对话的警告是为了向后兼容。否则,如果使用C11编译器编译,它将破坏先前成功编译的C98代码。