10 January 2024

C++ 核心指南目录

“Don’t insist to have only a single return-statement in a function”

理由

如果坚持只能有一个返回值的话,会导致代码逻辑很绕,还要引入额外的状态变量。尤其是,这种“只有一个返回值规则”会导致很难在函数的顶部进行错误检测。

例子

template<class T>
//  requires Number<T>
string sign(T x)
{
    if (x < 0)
        return "negative";
    if (x > 0)
        return "positive";
    return "zero";
}

如果只能有一个返回值的话。我们可能要这样写:

template<class T>
//  requires Number<T>
string sign(T x)        // bad
{
    string res;
    if (x < 0)
        res = "negative";
    else if (x > 0)
        res = "positive";
    else
        res = "zero";
    return res;
}

这种写法一方面代码更长,另一方面效率更低。代码越长越复杂,就会越痛苦。当然,有些简单的函数本身就只有一个返回语句。因为其本身就只是简单的逻辑。

例子

int index(const char* p)
{
    if (!p) return -1;  // error indicator: alternatively "throw
                        // nullptr_error{}"
    // ... do a lookup to find the index for p
    return i;
}

如果我们遵循一个返回语句规则的话,就成这样了:

int index2(const char* p)
{
    int i;
    if (!p)
        i = -1;  // error indicator
    else {
        // ... do a lookup to find the index for p
    }
    return i;
}

注意,这里我们故意违反了变量应当初始化规则。因为一个返回语句规则很容易导致变量为初始化错误。而且,这种风格的代码很容易倾向于用 goto exit 方式结束函数。

其他方案

  • 保持函数简单短小。
  • 放心使用多个返回语句(以及抛出异常)