簡體   English   中英

用於聚合結構初始化時的三元運算符 integer 表達式的類型

[英]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 b? 1: 0肯定是int

大括號初始化(包括聚合初始化)不允許執行收縮轉換,例如從有符號類型到無符號類型的轉換。 這是一種縮小轉換,因為源類型中的某些值(負數)無法在目標類型中表示。 當窄化轉換發生在非大括號上下文中時,它是允許的。

GCC 將不允許的縮小轉換視為警告而不是錯誤,但從技術上講,您的代碼格式不正確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM