首页 >后端开发 >C++ >为什么我不能在 C 中运算符的右侧使用初始化列表?

为什么我不能在 C 中运算符的右侧使用初始化列表?

Barbara Streisand
Barbara Streisand原创
2024-12-13 21:17:12428浏览

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