如何使用单个返回语句返回对变量的引用

How to return reference to variable with single return statement

本文关键字:返回 变量 引用 语句 何使用 单个      更新时间:2023-10-16

请考虑以下代码片段。

MyType_t& Variable(int i) {
if (i == 0) {
return MyVariable0;
}
if (i == 1) {
return MyVariable1;
}
return MyDefaultVariable;
}

这将返回对变量的引用,然后可以修改该变量。

Variable(1) = 10;

但是,我们的编码标准说使用单点返回。我将如何实现这一点?出于某种原因,以下内容似乎只复制值(因此不返回对根变量的引用(,即使我已经验证了单步执行代码,它将var设置为适当的变量。 使用指针会很简单,但我就是无法正确引用。

MyType_t& Variable(int i) {
MyType_t& var = MyDefaultVariable;
if (i == 0) {
var = MyVariable0;
}
if (i == 1) {
var = MyVariable1;
}
return var;
}

笔记

返回的变量具有全局作用域(它在嵌入式系统上(。

该函数用作类中的方便方法,用途/范围非常有限。

您的引用绑定到MyDefaultVariable之后您无法修改它,因为这就是它的工作原理。您的var = MyVariable0;有效地调用了MyDefaultVariable的复制运算符,这会导致您观察到的行为。

如果要避免在此处使用三元运算符,可以使用与建议相近的内容,但稍后在 return 语句中使用取消引用的指针。

MyType_t& Variable(int i) {
MyType_t* var = &MyDefaultVariable;
if (i == 0) {
var = &MyVariable0;
}
if (i == 1) {
var = &MyVariable1;
}
return *var;
}

如果您希望函数在添加更多变量的同时保持可读性,我不鼓励使用引用/三元运算符。指针将是要走的路。

MyType_t& Variable(int i)
{
MyType_t* var = &MyDefaultVariable;
if (0 == i)
var = &MyVariable0;
else if (1 == i)
var = &MyVariable1;
return *var;
}

您可以使用条件运算符:

MyType_t& Variable(int i) {
return ( i==0 ) ? MyVariable0 : ( i==1) ? MyVariable1 : MyDefaultVariable;
}

但是,恕我直言,强迫您编写不可读代码的编码标准不值得称为"编码标准"。

std::reference_wrapper 将提供此功能,而不会使您面临原始指针的风险。 使用reference_wrappers也表达了意图。

请注意,将新引用分配给 std::reference_wrapper 将导致包装器重新绑定,它不会覆盖引用变量的内容。

#include <functional>
using MyType_t = int;
extern int& MyDefaultVariable;
extern int& MyVariable0;
extern int& MyVariable1;

MyType_t& Variable(int i) {
auto var = std::ref(MyDefaultVariable);
if (i == 0) {
var = MyVariable0;
}
if (i == 1) {
var = MyVariable1;
}
return var;
}

另一种表达方式是:

MyType_t& Variable(int i) 
{
auto var = std::ref(MyDefaultVariable);
switch(i)
{
case 0: var = MyVariable0; break;
case 1: var = MyVariable0; break;
default: break;
}
return var;
}