运算符表达式中的初始化器列表:困境
在 C 中,用大括号括起来的初始化器列表提供了一种初始化变量的便捷方法。然而,当尝试在运算符表达式中使用初始值设定项列表时,会出现一个有趣的问题。考虑以下代码:
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}; // This line gives an error return 0; }
为什么此代码会产生错误,特别是关于包含表达式 baz
初始值设定项列表:表达式的例外
在标准的 §5 下,表达式是精确定义的。令人惊讶的是,初始值设定项列表本身并不被视为表达式。二元运算符(包括
有限例外
标准为初始值设定项提供了几个例外 -列表用法,包括作为函数参数和赋值语句。但是,该例外并不适用于二元运算符。
限制的原因
此限制的理由是多方面的。根据草案/讨论文件 N2215,允许初始化列表同时作为运算符的左侧和右侧操作数将引入语法复杂性,从而对解析器提出挑战。论文的作者最终决定,允许它们在右侧而不是左侧会太麻烦。
结论
虽然初始化列表虽然它们在某些情况下提供了便利,但它们在运算符右侧的使用受到限制,这源于句法挑战和对语言语法一致性的渴望。作为将初始值设定项列表作为操作数的替代方法,可以使用构造函数调用或直接将 bar 实例作为参数传递给运算符
baz << bar{1, -2, "foo", 4, 5};
以上是为什么初始化列表不能直接用作 C 二元运算符表达式中的操作数?的详细内容。更多信息请关注PHP中文网其他相关文章!