2017-01-12 4 views
3

responseのタイプと修飾子に関係なく、コピーコンストラクタとコピー代入演算子に副作用がないと仮定して、次の2つのコードスニペットは同じですか?彼らはまったく同じことを行うように思わラムダはイニシャライザを持たないラムダと同等のものですか?

auto foo = [response]() { 
    do_something(response); 
}; 

そして

auto foo = [response = response]() { 
    do_something(response); 
}; 

は– –はなく、特定のケースでは、唯一の第二のバージョンはコンパイル対象の応答をコピーします。ここで

は、問題を実証するサンプルプログラムです:

#include <memory> 
using namespace std; 
void do_something() { 
} 
int main() { 
    auto au = [](auto callback) { 
     callback(); 
    }; 
    auto x = [&au](shared_ptr<int> response) { 
     au([response = move(response)]() mutable { 
      auto foo = [response/* = response*/]() { // uncomment and it will work 
       do_something(); 
      }; 
     }); 
    }; 
    x(make_shared<int>(100)); 
} 

responseは、この問題が発生するためstd::shared_ptrでなければならないようですが、私はなぜわかりません。 shared_ptrをコピーしても実際のリソース(つまりint)はコピーされませんが、コードのコンパイルに失敗する可能性があります。私は、上位2つのコードスニペットがまったく同じことを常に信じてきました。

MSVC 2015を使用してDebug x86でコンパイルしましたが、Releaseまたはx64としてコンパイルすると同じ結果になると思います。

+0

コメント版はgccとclangの両方で動作します。これはコンパイラのバグかもしれません。 – user2079303

+1

[可能性があります](http://stackoverflow.com/a/36188986/3953764)変数の取り込みに使用される構文は重要であり、いずれもコードに適用されないようです –

+0

名前検索の仕組みには違いがありますMSVCで問題が発生しているかどうかはわかりません。 – TartanLlama

答えて

2

コンパイラに問題があるようです。最新のVisualC++ v19.10.24903.0がコンパイルされます。オンラインで試すことができますhere

+1

そうだね。私はちょうどオンライン[ここ](http://rextester.com/l/cpp_online_compiler_visual)でそれをテストし、問題もそこに存在します。 – Bernard

+0

@Bernard :) – AMA

関連する問題