5

我只花了 3 个小时,可能更多,试图找到一个错误、段错误或 bad_allow,这取决于我修改代码的方式,以便了解什么对象在弄乱堆栈或内存:我把所有的对象都怀疑了。 ..我屠杀了班级...(尽管如此,事实证明这很好,因为这些班级最终发现自己毫无用处:-))...

但是,实际上,真正的错误很简单: 我没有在应该返回值的函数中编写 return 语句(在我的例子中,我需要返回 a std::vector<boost::any>)。

我认为没有它就无法编译gcc (4.6.3) 。当我想起ms visual 2010也发生了类似的事情时,我感到更加陌生。

所以现在我想知道不写退货声明是否合法?在这种情况下会发生什么?

是否与 main 可以具有返回值的事实有关?还是我应该考虑去gcc 4.7

4

2 回答 2

10

这是未定义的行为:

[C++11: 6.6.3/2]: [..]从函数的末尾流出相当于return没有值的 a;这会导致值返回函数中的未定义行为。

它编译是因为:

  1. 编译器不需要诊断它;
  2. 诊断这并不总是微不足道的,因此您的编译器不会打扰;
  3. C++ 是一种“自己动手”的语言。
于 2013-02-24T23:01:53.107 回答
5

如果你用标志编译-Wall -Wextra -pedantic它应该给你一个关于一个应该返回一个值但不这样做的函数的编译器警告。

于 2013-02-24T23:06:26.817 回答