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

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

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-09 01:19:13701浏览

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

RHS 上的运算符重载和初始化器列表

在 C 编程中,初始化器列表是一种简洁的语法,用于使用表达式列表初始化聚合对象。虽然初始化列表可以在各种场景中方便地使用,但它们在运算符右侧 (RHS) 的使用一直是一个讨论点。

为什么初始化列表在 RHS 上受到限制

C 11 不允许在运算符的 RHS 上列出初始值设定项列表,包括二元运算符

  • 初始化器列表不是表达式:根据 C 标准,初始化器列表不被视为表达式。二元运算符参数通常是表达式,并且为表达式定义的语法不包括初始值设定项列表。
  • 解析器挑战:允许运算符左侧 (LHS) 的初始值设定项列表带来了语法挑战。如果表达式的标准语法允许在 LHS 和 RHS 位置都允许初始化器列表,则它可能会变得不明确。

初始化器列表的例外

尽管存在一般限制在运算符参数中使用初始值设定项列表,C 确实定义了特定的异常,其中初始值设定项列表是接受:

  • 作为函数的参数
  • 作为数组访问表达式中的下标
  • 作为构造函数的参数
  • 在 return 语句中
  • 作为变量定义中的初始化器

在你的代码中,你可以使用初始化列表作为 bar 构造函数的参数,该构造函数在

foo baz;
baz << bar{1, -2, "foo", 4, 5}; // Legal

限制原因

限制运算符 RHS 上的初始值设定项列表的决定源于保持一致且清晰的语法的愿望。在所有上下文中允许初始化程序列表会在语言中引入额外的复杂性和潜在的歧义。

正如您问题中提到的讨论文件中所指出的,考虑了允许在右侧而不是左侧的初始化程序列表的替代方案太有问题了。因此,选择了仅在特定上下文中允许初始化列表的保守方法。

以上是为什么不能在 C 运算符的右侧使用初始化列表?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn