2017-05-29 3 views
1

ブースト変換されたアダプターを使用してブースト範囲をラップしようとしていますが、これはうまくいかないようです。私は説明するために最小の例を作った。リリースモードでC++ boostの範囲:any_rangeと変換されたアダプター

std::vector<int> myInts = { 1,2,3,4,5 }; 
boost::any_range<double,boost::forward_traversal_tag,double> range = 
    myInts | boost::adaptors::transformed([](int x) { return static_cast<double>(x); }); 

for (double x : range) 
    std::cout << x << "\n"; 

、私のVS2015のコンパイラは、「ローカル変数または一時的のアドレスを返す」私に言って続けています。コードは実行時に正しく機能しません。デバッグモードでは問題ありません。

の代わりにdoubleに参照テンプレートパラメータを明示的に設定しても、変換されたアダプタが値によって返されるとは何とか解釈できないと思います。

any_rangeで何が問題になっていますか? (ブースト1.64.0を使用)

+0

'boost :: any_range'を' auto'に置き換えると、エラーは残っていますか?問題がany_rangeにあるかどうかを判断しようとしています。 –

+0

'boost :: any_range'を' auto'に置き換えると、エラーはなくなります。エラーは、 'boost :: any_range'を使ってトランスフォームイテレータをタイプするときにのみ発生します。 –

答えて

1

タイプ控除システムは、あなたの範囲が読み取り専用であることを認識する必要があるので、boost::any_range<const double, boost::forward_traversal_tag, const double>に変更する必要があります。

+0

ありがとうございます。これは、コードを実行するときに問題を解決します。しかし、不思議にも、コンパイラの警告が残っています。 –

関連する問題