考虑真实的代码:
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.
}
如果var
在type_object
的第一次递归调用后具有operator <<
类型,则此代码将崩溃程序,因为在预期std::ostream
引用时它不会返回任何内容。
Clang 3.1甚至不打印警告。
现代GCC和MSVC打印警告但编译它。
为什么C ++编译器允许这样的错误代码?
此外,我很高兴看到任何对C ++标准的引用,它允许这样的代码或解释,当它有用时。