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)
如果您想返回赋值运算的结果,您可以(在大多数情况下)无需像您的“实用程序”函数一样执行此操作assign,因为赋值表达式本身有一个值;来自 cppreference(粗体我的):
\n\n直接赋值运算符需要一个可修改的左值作为其左操作数,并需要一个右值表达式或一个大括号初始化列表 (C++11 起)\作为其右操作数,并返回一个左值来标识修改后的左操作数。
\n
或者,来自此 C++17 标准草案:
\n\n\n8.5.18 赋值和复合赋值运算符 \xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 \xc2\xa0[expr.ass]
\n1 \xc2\xa0 赋值运算符 (=) 和复合赋值运算符都是从右到左排列的。全部都需要一个可修改的左值作为其左操作数;它们的结果是引用左操作数的左值。\n\xe2\x80\xa6
\n
因此,正如评论中所建议的,您可以简单地执行以下操作:
\nint& do_work(const int* p, bool cond, int& result)\n{\n return cond ? do_work_(p, result) : (result = *p);\n}\nRun Code Online (Sandbox Code Playgroud)\n