0

コードでこの問題を見つけるのに 1 時間を費やしました。

vector<string> & input_variables = parse_xml(xml_path)["variables"];

parse_xml返す関数std::map<std::string, std::vector<std::string> >です。gcc が (-Wall を使用して) 警告しないのはなぜですか? いくつかのフラグがありませんか?

4

3 に答える 3

2

破棄されたオブジェクトへの参照を取得しました。C++11 では、このコードを違法にする新しい言語機能が書かれています。使用する場合は、データをローカル変数にコピーまたはスワップする必要があります。C++03 はそのようなことを防ぐために必要な機能を提供していないため、GCC は警告しません。

技術的には、 の戻り値operator[]は左辺値です。残念ながら、所有者である によって破棄されようとしていstd::mapます。

于 2012-04-23T16:36:19.400 に答える
1

技術的には警告する必要がないため、GCC は警告しません。

parse_xml()std::map一時的な by 値を返します。呼び出すoperator[]と参照が返されます。コンパイラーは、この参照が実際には一時の一部であることをローカルで認識できません。コンパイラが知っているすべてのことは、グローバルまたは何かへの参照を返す可能性があります。std::mapoperator[]

一時変数のメンバー変数は一時変数と見なされ、外側の一時変数の有効期間にリンクされます。しかし、関数の戻り値 ( などoperator[]) はあまりリンクされていません。

于 2012-04-23T21:20:57.187 に答える
0

警告が表示されないのは、一連の有効な手順で無効な操作を取得しているためです。

struct X
{
    int c;
    int & operator [] (int) { return c; } /* this is perfectly OK */
};

X f()
{
    return X(); /* this is perfectly OK */
}

int main()
{
    int &x = f()[1]; /* can apply [] on temporary, therefore OK */
}

f()asの結果を明示的にマークすることで、これを防ぐことができますconst

于 2012-04-23T16:55:09.707 に答える