実際のコードを考えてみましょう:
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++ 標準への参照を参照していただければ幸いです。