我可以在没有实用程序例程的情况下分配和返回吗?

Can I assign and return without a utility routine?

提问人:Jack Brown 提问时间:1/18/2022 最后编辑:Jack Brown 更新时间:2/9/2022 访问量:58

问:

有没有办法在不创建实用程序例程的情况下“分配和返回”?这是我的代码:

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)) {}
C++ 引用 返回 条件运算符 assignment-operator

评论

0赞 rturrado 1/18/2022
你真的想 1) 返回结果和 2) 使用其中一个参数作为输出(返回)参数吗?
4赞 Stefan Riedel 1/18/2022
我可能误解了这个问题,但这不是你想要的吗?return result = *p;
1赞 KamilCuk 1/18/2022
return cond ? (result = *p) : (result = *p * 10);?return result = *p * (cond ? 1 : 10);
1赞 KamilCuk 1/18/2022
那你想要 ?我想你现在应该能够弄清楚了。return cond ? do_work_(p, result) : (result = *p);
1赞 Stefan Riedel 1/18/2022
@JackBrown这并不意味着以任何方式卑鄙,我只是不知道你实际上在要求什么 - 顺便说一句,这里有一些示例代码 godbolt.org/z/d5r56hbPG

答:

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);
}