为什么具有返回值的函数不能返回什么?

时间:2012-08-07 09:34:56

标签: c++

  

可能重复:
  Why can you return from a non-void function without returning a value without producing a compiler error?

考虑真实的代码:

std::ostream &operator << (std::ostream &stream, const sqc_var &var)
{
    switch (var.type()) 
    {
        case sqc_var::type_number:
            return stream << var.as_number();
        case sqc_var::type_string:
            return stream << var.as_string();
        case sqc_var::type_object:
            stream << "{";
            for (auto &child : var.children())
            {
                stream << child.name() << ": " << child.value() << " "; // <-- crash there
            }
            stream <<  " }";
    }

    //// return stream; <-- originaly no return was there.
}

如果vartype_object的第一次递归调用后具有operator <<类型,则此代码将崩溃程序,因为在预期std::ostream引用时它不会返回任何内容。

Clang 3.1甚至不打印警告。

现代GCC和MSVC打印警告但编译它。

为什么C ++编译器允许这样的错误代码?

此外,我很高兴看到任何对C ++标准的引用,它允许这样的代码或解释,当它有用时。

0 个答案:

没有答案