在C++中返回局部变量(Effective C++,3rd edition中的Rule 21)

use*_*623 0 c++ return local effective-c++

众所周知,由于作用域,从C++中的函数返回局部变量是不安全的.在Effective C++第三版中,Scott Meyers在第21页的第21项中讲述了这个问题.然而,最后他说,正确的决定将是:

inline const Rational operator*(const Rational& lhs, const Rational& rhs) {
    return Rational(lhs.n * rhs.h, lhs.d * rhs.d);
}
Run Code Online (Sandbox Code Playgroud)

这不是一个坏习惯,这个功能不安全吗?

UPD:谢谢大家的解释.

Woj*_*wka 8

从函数返回局部变量是正常的,没有错.返回指针局部变量的引用是不同的故事,但在您的示例中没有任何类型.


Kei*_*son 7

您实际上无法返回局部变量.您可以返回局部变量的,或指向它的指针(即其地址)或对它的引用.

返回局部变量的是非常安全的:

int good_func() {
    int local = 42;
    return local; // returns a copy of the value of "local"
}
Run Code Online (Sandbox Code Playgroud)

返回指向本地变量的指针引用是不安全的,因为当函数终止时变量不再存在:

int* bad_func() {
    int local = 42;
    return &local; // returns a pointer to "local"
}
Run Code Online (Sandbox Code Playgroud)

(这同样适用于C,除了C没有C++风格的引用.)