【问题标题】:Can I assign and return without a utility routine?我可以在没有实用程序的情况下分配和返回吗?
【发布时间】:2022-01-18 13:33:15
【问题描述】:

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

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

我可以在没有assign() 实用程序的情况下实现do_work() 吗?


do_work() 签名的原因是它很方便:

const int value=1;
int i, j;
if (do_work(&value, true, i) == do_work(&value, false, j)) {}

【问题讨论】:

  • 你真的想要both 1) 返回结果和 2) 使用其中一个参数作为输出(返回)参数吗?
  • 我可能误解了这个问题,但return result = *p; 不正是您所要求的吗?
  • return cond ? (result = *p) : (result = *p * 10);? return result = *p * (cond ? 1 : 10);
  • 那你想要return cond ? do_work_(p, result) : (result = *p);?我想你现在应该可以弄清楚了。
  • @JackBrown 这并不意味着任何意思,我只是不知道您实际要求什么 - 这是一些示例代码 btw godbolt.org/z/d5r56hbPG

标签: c++ reference return conditional-operator assignment-operator


【解决方案1】:

如果你想返回赋值操作的结果,你可以(在大多数情况下)在没有像 assign 这样的“实用”函数的情况下这样做,因为赋值表达式本身有一个值; from cppreference(加粗我的):

直接赋值运算符期望一个可修改的左值作为它的左值 操作数和右值表达式或花括号初始化列表 (C++11 起) 作为它的右操作数,并返回一个左值标识左 修改后的操作数

或者,来自this Draft C++17 Standard

8.5.18 赋值和复合赋值运算符       [expr.ass]

1 赋值运算符 (=) 和复合赋值运算符 all 从右到左分组。都需要一个可修改的左值作为左值 操作数; 他们的结果是一个引用左操作数的左值。 …

因此,正如 cmets 中所建议的,您可以简单地拥有以下内容:

int& do_work(const int* p, bool cond, int& result)
{
   return cond ? do_work_(p, result) : (result = *p);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    相关资源
    最近更新 更多