c++ - 用于聚合结构初始化时的三元运算符整数表达式的类型

标签 c++ struct conditional-operator aggregate-initialization

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

关于c++ - 用于聚合结构初始化时的三元运算符整数表达式的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66769830/

相关文章:

c++ - MSVC编译器认为我正在引用已删除的函数,但据我所知,我不是

java - Java中的三元运算符链表查找方法

c++ - 滚动时Qml Listview项目消失

c++ - 套接字程序段错误 : *** stack smashing detected ***

c - 所有对 struct doxygen 的引用列表

c++ - 将结构复制/移动到另一个结构

c - 如何在结构内搜索并显示它

c - 表达式 a<=20?b=30 怎么写 :c=30; such that 30 is used only once?

python - 为什么 "if-else-break"在 python 中中断?

c++ - 指针差异