为什么具有 return 类型但没有 return 任何类型的函数不会编译失败?

Why a function that has a return type but doesn't return anything doesn't fail compilation?

考虑以下示例,使用 g++ 5.4(仅限)编译:

#include <iostream>

int foo()
{
    std::cout << "foo" << std::endl;
}

int main()
{
    std::cout << foo();
    return 0;
}

foo() 没有任何 return 语句,代码编译并且函数将 return 一个未知值,当 return 类型是 a 时也会发生同样的情况指针 - 这可能会导致分段错误。

为什么编译这样的函数时没有error/warning?

是因为 C++ 标准还是实现问题?

语言定义说这会产生未定义的行为。那是因为有时无法对其进行诊断。警告您这种事情的编译器有时是错误的。我添加了一个不需要的 return 语句来让一个编译器静音,结果另一个编译器抱怨 return 语句为 "unreachable code"

我使用的是 g++ 9.3.0,所以不能说太多关于 g++ 5.4

在旧版本中,如果您的 C++ 程序缺少来自函数的 return 语句,而该语句应该是 return 一个值,g++ 将毫无错误地编译它(甚至是警告,除非使用 -Wreturn-type 或 -Wall 或 -Werror=return-type)。尝试使用函数中的 return 值很可能会导致分段错误。

如果您想要这种行为,请使用 -Werror=return-type

Why there is no error ... when compiling such a function?

因为程序格式正确。编译器需要成功编译所有格式良好的程序。

Why there is no ... warning when compiling such a function?

标准不要求有警告。如果您要求编译器这样做,旧版本的 GCC 只会警告此类错误。 GCC 8 默认启用此特定警告。

and the function will return an unknown value

不完全是。如果执行到达非 void 函数的末尾而没有 return,则程序的行为是未定义的,因此这可能会或可能不会发生。

请注意,如果流插入运算符碰巧抛出或终止程序,该函数实际上将具有明确定义的行为。我们知道,流插入并不能保证抛出或终止程序,这实际上是非常令人惊讶的。但是编译器不能做出那种概括。