提问人:Jack Brown 提问时间:1/18/2022 最后编辑:Jack Brown 更新时间:2/9/2022 访问量:58
我可以在没有实用程序例程的情况下分配和返回吗?
Can I assign and return without a utility routine?
问:
有没有办法在不创建实用程序例程的情况下“分配和返回”?这是我的代码:
static int& do_work_(const int* p, int& result)
{
result = (*p) * 10;
return result;
}
template<typename T>
T& assign(const T* p, T& result)
{
result = *p;
return result;
}
int& do_work(const int* p, bool cond, int& result)
{
return cond ? do_work_(p, result) : assign(p, result);
}
我可以在没有该实用程序的情况下实现吗?do_work()
assign()
签名的原因是它是一个很好的方便:do_work()
const int value=1;
int i, j;
if (do_work(&value, true, i) == do_work(&value, false, j)) {}
答:
6赞
Adrian Mole
1/18/2022
#1
如果要返回赋值操作的结果,则可以(在大多数情况下)不使用像 这样的“效用”函数,因为赋值表达式本身具有一个值;来自 cppreference (粗体我的):assign
直接赋值运算符需要一个可修改的左值作为其左值 操作数和右值表达式或 braced-init-list(从 C++11 开始) 作为其右操作数,并返回一个标识左的左值 修改后的操作数。
或者,从此草案 C++17 标准:
8.5.18 赋值和复合赋值运算符 [expr.ass]
1 这 赋值运算符 (=) 和复合赋值运算符全部 从右到左分组。所有这些都需要一个可修改的左值作为它们的左 操作数;它们的结果是一个左值,指的是左操作数。 ...
因此,正如评论中建议的那样,您可以简单地拥有以下内容:
int& do_work(const int* p, bool cond, int& result)
{
return cond ? do_work_(p, result) : (result = *p);
}
评论
return result = *p;
return cond ? (result = *p) : (result = *p * 10);
?return result = *p * (cond ? 1 : 10);
return cond ? do_work_(p, result) : (result = *p);