微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在聚合结构初始化中使用时的三元运算符整数表达式的类型

如何解决在聚合结构初始化中使用时的三元运算符整数表达式的类型

在使用三元运算符表达式聚合初始化结构时,我遇到了一个有趣的警告(至少使用 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 将不允许的收缩转换视为警告而不是错误,但从技术上讲,您的代码格式错误。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。