コードでこの問題を見つけるのに 1 時間を費やしました。
vector<string> & input_variables = parse_xml(xml_path)["variables"];
をparse_xml
返す関数std::map<std::string, std::vector<std::string> >
です。gcc が (-Wall を使用して) 警告しないのはなぜですか? いくつかのフラグがありませんか?
コードでこの問題を見つけるのに 1 時間を費やしました。
vector<string> & input_variables = parse_xml(xml_path)["variables"];
をparse_xml
返す関数std::map<std::string, std::vector<std::string> >
です。gcc が (-Wall を使用して) 警告しないのはなぜですか? いくつかのフラグがありませんか?
破棄されたオブジェクトへの参照を取得しました。C++11 では、このコードを違法にする新しい言語機能が書かれています。使用する場合は、データをローカル変数にコピーまたはスワップする必要があります。C++03 はそのようなことを防ぐために必要な機能を提供していないため、GCC は警告しません。
技術的には、 の戻り値operator[]
は左辺値です。残念ながら、所有者である によって破棄されようとしていstd::map
ます。
技術的には警告する必要がないため、GCC は警告しません。
parse_xml()
std::map
一時的な by 値を返します。呼び出すoperator[]
と参照が返されます。コンパイラーは、この参照が実際には一時の一部であることをローカルで認識できません。コンパイラが知っているすべてのことは、グローバルまたは何かへの参照を返す可能性があります。std::map
operator[]
一時変数のメンバー変数は一時変数と見なされ、外側の一時変数の有効期間にリンクされます。しかし、関数の戻り値 ( などoperator[]
) はあまりリンクされていません。
警告が表示されないのは、一連の有効な手順で無効な操作を取得しているためです。
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
。