2

重複の可能性:
コンパイラ エラーを生成せずに値を返さずに非 void 関数から戻ることができるのはなぜですか?

実際のコードを考えてみましょう:

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_objectoperator <<std::ostream

Clang 3.1 は警告を出力しません。

最新の GCC と MSVC は警告を表示しますが、コンパイルします。

C++ コンパイラがそのような誤ったコードを許可するのはなぜですか?

また、有用な場合にそのようなコードや説明を許可する C++ 標準への参照を参照していただければ幸いです。

4

0 に答える 0