2016-04-01 6 views
5

次のコードはコンパイルしますが、VC++ 2015(リリース)では未定義の出力が得られ、実行時のエラーはother compilersとなります。std :: function <int(int)>をstd :: function <const int&(const int&x)>に割り当てる

​​

g = f;の割り当てはなぜ許可されますか?

+0

は、apple clangで完全にコンパイルして実行します。 –

+1

関連性の高い/可能なdupe:http://stackoverflow.com/q/32871606/2069064 – Barry

答えて

5

はラムダ又はstd::functionを回避するために書き直さ同等のコードを検討:

int f(int x) { return x; } 
int const& g(int const& x) { return f(x); } 

これは、それにもかかわらず、一時的にダングリング参照を返すので、未定義の動作を引き起こすことになりますことは、完璧に形成されたコードです。元のコードは同じ理由で払い戻されます。オブジェクトを暗黙的に同じタイプの参照に変換することができます。残念ですが、この場合。

+0

ありがとう。あなたの例は少なくとも警告を発する(http://codepad.org/o6ejBjn6)。 'std :: function'を使った例はありません。 –

4

右辺値はconst&にバインドできます。 const&は右辺値に変換できます。エラーがない、

int f(int x){return x;} 
int const& g(int const& x){ return f(x); } 

同様に、gへの呼び出しが合法である、まだg(42)の結果を読み取ることUBである - 参照がぶら下がっ:

これを調べ。

良いコンパイラでは、一時参照がバインドされた参照が返され、警告されます。

functionは、型が変換可能かどうかを単純にチェックします。それは生涯分析をしません。おそらく、このエラーを静的に検出できるので、これはすべきです。

関連する問題