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

时间:2018-09-27 12:30:48

标签: c++

请考虑以下代码段。

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

注释

返回的变量具有全局范围(在嵌入式系统上)。

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

4 个答案:

答案 0 :(得分:6)

您的参考已绑定到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;
}

答案 1 :(得分:4)

如果您希望函数在添加更多变量时保持可读性,则不建议使用引用/三元运算符。指针将是必经之路。

MyType_t& Variable(int i)
{
MyType_t* var = &MyDefaultVariable;

if (0 == i)
    var = &MyVariable0;
else if (1 == i)
    var = &MyVariable1;

return *var;
}

答案 2 :(得分:1)

您可以使用条件运算符:

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

但是,强迫您编写不可读代码的编码标准不应该被称为“编码标准”恕我直言。

答案 3 :(得分:0)

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