用于聚合结构初始化时的三元运算符整数表达式的类型
Type of ternary operator integer expression when used in aggregate struct initialisation
我 运行 遇到一个有趣的警告(至少使用 GCC 和 clang -Wnarrowing
,还没有测试其他编译器),当使用三元运算符表达式聚合初始化结构时(请参阅下面的代码)。我不明白为什么表达式的类型在聚合初始化情况下显然被认为是 int
,但在其他情况下却被默默地强制为 size_t
。如果 C++23 size_t
文字是一回事,这显然不是问题,因为您只需使用正确的文字类型。我只是好奇这里到底发生了什么,如果有人知道吗?
#include <cstddef>
int main()
{
struct S { size_t m; };
S s1 = {0}; // No warning
bool b = true;
S s2 = {b ? 1 : 0}; // warning: narrowing conversion of '(b ? 1 : 0)' from 'int' to 'size_t'
//S s2 = {b ? 1u : 0u}; // No warning
size_t s3 = b ? 1 : 0; // No warning
return s1.m || s2.m || s3;
}
b ? 1 : 0
的类型肯定是int
。
大括号初始化(包括聚合初始化)不允许执行缩小转换,例如从有符号类型到无符号类型的转换。这是一个缩小转换,因为源类型中的某些值(即,负数)无法在目标类型中表示。当在非大括号上下文中发生收缩转换时,它是允许的。
GCC 将不允许的缩小转换视为警告而不是错误,但从技术上讲,您的代码格式不正确。
我 运行 遇到一个有趣的警告(至少使用 GCC 和 clang -Wnarrowing
,还没有测试其他编译器),当使用三元运算符表达式聚合初始化结构时(请参阅下面的代码)。我不明白为什么表达式的类型在聚合初始化情况下显然被认为是 int
,但在其他情况下却被默默地强制为 size_t
。如果 C++23 size_t
文字是一回事,这显然不是问题,因为您只需使用正确的文字类型。我只是好奇这里到底发生了什么,如果有人知道吗?
#include <cstddef>
int main()
{
struct S { size_t m; };
S s1 = {0}; // No warning
bool b = true;
S s2 = {b ? 1 : 0}; // warning: narrowing conversion of '(b ? 1 : 0)' from 'int' to 'size_t'
//S s2 = {b ? 1u : 0u}; // No warning
size_t s3 = b ? 1 : 0; // No warning
return s1.m || s2.m || s3;
}
b ? 1 : 0
的类型肯定是int
。
大括号初始化(包括聚合初始化)不允许执行缩小转换,例如从有符号类型到无符号类型的转换。这是一个缩小转换,因为源类型中的某些值(即,负数)无法在目标类型中表示。当在非大括号上下文中发生收缩转换时,它是允许的。
GCC 将不允许的缩小转换视为警告而不是错误,但从技术上讲,您的代码格式不正确。