【发布时间】:2015-06-03 11:26:52
【问题描述】:
刚刚收到编译器针对此函数的警告:
template<class T>
Matrix3x3<T> & operator - (Matrix3x3<T> const & p)
{
auto m = Matrix3x3<T>(p);
m.m11 = -m.m11; m.m12 = -m.m12; m.m13 = -m.m13;
m.m21 = -m.m21; m.m22 = -m.m22; m.m23 = -m.m23;
m.m31 = -m.m31; m.m32 = -m.m32; m.m33 = -m.m33;
return m;
}
,我想知道为什么返回局部变量或临时地址的地址不会出错。在某些情况下您必须这样做吗?这只是“未定义的行为”而不是语言限制的理由是什么?
我想不出来。
【问题讨论】:
-
可以在函数中声明为静态的。
-
编译器不知道它是静态的吗?
-
随机数生成 ;)
-
如果我不得不猜测的话,可能是一些旧的 C 代码——可能是实现端而不是在应用程序库/代码中——故意返回这些值作为向例如报告堆栈使用情况的一种方式。与已知的堆栈限制相比,在失败前处理递归,选择缓冲区大小等。使用内联汇编获取堆栈指针更简单,但并非所有编译器都拥有/拥有。如果在表达式中做这样的事情(可能是宏替换),在调用上下文中创建一个本地变量将不是一个选项(没有像 GCC 的语句表达式扩展这样的东西)。
-
在一般情况下(参见 Entscheidungsproblem),在使用它时找到所有肯定会导致未定义行为的地方是不可能的。我认为委员会不会要求“在可能的情况下发现错误,但有时你不能,所以......”。 (注意,如果你从不使用返回值,没有问题。)
标签: c++ compiler-warnings