初始化列表和运算符的右侧
考虑以下代码片段:
class foo { }; struct bar { template<typename... T> bar(T const&...) { } }; foo& operator<<(foo& f, bar const&) { return f; } int main() { foo baz; baz << {1, -2, "foo", 4, 5}; return 0; }
编译器抱怨在运算符的右侧 (RHS) 使用初始化列表
初始化器列表和表达式
初始化器列表不是C 标准中定义的表达式。函数和运算符的参数通常必须是表达式。然而,该标准定义了某些上下文中初始化列表的例外情况,包括作为函数参数、下标和赋值表达式。
二元运算符没有例外
没有在二元运算符的右侧(或左侧)使用初始值设定项列表的例外。这一禁令源于允许初始化列表作为表达式时出现的解析挑战。对初始值设定项列表和块使用大括号会导致语法中的歧义。
限制的基本原理
将初始值设定项列表的使用扩展到表达式的提案2007 年曾考虑过。但是,最终决定允许初始化列表作为二元运算符的右侧操作数,但不允许作为左侧操作数
结论
初始化列表不能在运算符的 RHS 上使用,因为它们没有在标准中定义为表达式。虽然它们在特定上下文中的使用存在某些例外,但由于在初始化列表和块中使用大括号,允许它们作为通用运算符参数将带来重大的解析挑战。
以上是为什么我不能在 C 中运算符的右侧使用初始化列表?的详细内容。更多信息请关注PHP中文网其他相关文章!