首頁 >後端開發 >C++ >為什麼我不能在 C 中運算子的右側使用初始化清單?

為什麼我不能在 C 中運算子的右側使用初始化清單?

Barbara Streisand
Barbara Streisand原創
2024-12-13 21:17:12429瀏覽

Why Can't I Use Initializer Lists on the Right-Hand Side of Operators in C  ?

初始化清單和運算子的右邊

考慮以下程式碼片段:

class foo { };

struct bar
{
    template<typename... T>
    bar(T const&amp;...) { }
};

foo&amp; operator<<(foo&amp; f, bar const&amp;) { return f; }

int main()
{
    foo baz;
    baz << {1, -2, "foo", 4, 5};

    return 0;
}

編譯器在抱怨運算子的右側(RHS) 使用初始化清單

初始化器列表和表達式

初始化器列表不是C 標準中定義的表達式。函數和運算子的參數通常必須是表達式。然而,該標準定義了某些上下文中初始化列表的例外情況,包括作為函數參數、下標和賦值表達式。

二元運算子沒有例外

沒有在二元運算子的右側(或左側)使用初始值設定項清單的例外。這項禁令源自於允許初始化清單作為表達式時出現的解析挑戰。對初始值設定項清單和區塊使用大括號會導致語法中的歧義。

限制的基本原理

將初始值設定項清單的使用擴展到表達式的提案2007 年曾考慮過。但是,最終決定允許初始化列表作為二元運算符的右側操作數,但不允許作為左側操作數

結論

初始化列表不能在運算符的RHS 上使用,因為它們沒有在標準中定義為表達式。雖然它們在特定上下文中的使用存在某些例外,但由於在初始化列表和區塊中使用大括號,允許它們作為通用運算符參數將帶來重大的解析挑戰。

以上是為什麼我不能在 C 中運算子的右側使用初始化清單?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn