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

Jac*_*own 1 c++ return reference conditional-operator assignment-operator

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

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);
}
Run Code Online (Sandbox Code Playgroud)

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


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

const int value=1;
int i, j;
if (do_work(&value, true, i) == do_work(&value, false, j)) {}
Run Code Online (Sandbox Code Playgroud)

Adr*_*ica 6

如果您想返回赋值运算的结果,您可以(在大多数情况下)无需像您的“实用程序”函数一样执行此操作assign,因为赋值表达式本身有一个值;来自 cppreference(粗体我的):

\n
\n

直接赋值运算符需要一个可修改的左值作为其左操作数,并需要一个右值表达式或一个大括号初始化列表 (C++11 起)\作为其右操作数,并返回一个左值来标识修改后的左操作数

\n
\n

或者,来自此 C++17 标准草案

\n
\n

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

\n

1 \xc2\xa0 赋值运算符 (=) 和复合赋值运算符都是从右到左排列的。全部都需要一个可修改的左值作为其左操作数;它们的结果是引用左操作数的左值。\n\xe2\x80\xa6

\n
\n

因此,正如评论中所建议的,您可以简单地执行以下操作:

\n
int& do_work(const int* p, bool cond, int& result)\n{\n   return cond ? do_work_(p, result) : (result = *p);\n}\n
Run Code Online (Sandbox Code Playgroud)\n