我理解这个C++函数的作用,但我不明白为什么return语句是这样编写的:
int intDivide(int num, int denom){
return assert(denom!=0), num/denom;
}
Run Code Online (Sandbox Code Playgroud)
这里只有一个声明,因为只有一个声明,;但逗号让我困惑.为什么不写:
int intDivide(int num, int denom){
assert(denom!=0);
return num/denom;
}
Run Code Online (Sandbox Code Playgroud)
除了"优雅"之外,还有什么东西可以在第一个版本中获得?
无论如何,这个逗号究竟在做什么?它是否将单个陈述分为两部分,以致上述两个版本基本相同?
虽然代码似乎没有使用constexpr,但C++ 11 constexpr函数被限制为只有一个语句必须是一个return语句.要执行非功能性断言并返回值,除了使用逗号运算符之外别无选择.但是,使用C++ 14,这个约束被删除了.
我可以想象这个函数是从一个最初读过类似宏的宏重写的
#define INT_DIVIDE(nom,denom) (assert(denom != 0), nom/denom)
Run Code Online (Sandbox Code Playgroud)
内置的逗号运算符只是对两个表达式进行排序.表达式的结果是第二个操作数.这两个功能确实是等同的.请注意,逗号运算符可能会过载.如果是,则表达式不按顺序排列,结果是过载定义的结果.
在实践中,逗号运算符有时候非常方便.例如,在扩展参数包时使用逗号运算符是很常见的:在某些用途中,每个扩展都需要生成一个值,并且为了避免void结果搞乱,可以使用逗号运算符来获取值.例如:
template <typename... T>
void g(T const& arg) {
std::initializer_list<bool>{ (f(arg), true)... };
}
Run Code Online (Sandbox Code Playgroud)
来自 C++ 标准:
5.19 逗号运算符 [expr.comma]
1 逗号运算符从左到右分组。Run Code Online (Sandbox Code Playgroud)expression: assignment-expression expression , assignment-expression由逗号分隔的一对表达式从左到右计算;左边的表达式是一个废弃值表达式(第 5 条)。87与左侧表达式相关的每个值计算和副作用都在与右侧表达式相关的每个值计算和副作用之前排序。结果的类型和值是右操作数的类型和值;结果与其右操作数具有相同的值类别,并且如果其右操作数是左值和位字段,则结果是位字段。如果右操作数的值为临时值 (12.2),则结果就是该临时值。
是的,这两个版本是相同的,除非逗号运算符被重载,正如@StoryTeller 评论的那样。
| 归档时间: |
|
| 查看次数: |
418 次 |
| 最近记录: |