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としてコンパイルすると同じ結果になると思います。
コメント版はgccとclangの両方で動作します。これはコンパイラのバグかもしれません。 – user2079303
[可能性があります](http://stackoverflow.com/a/36188986/3953764)変数の取り込みに使用される構文は重要であり、いずれもコードに適用されないようです –
名前検索の仕組みには違いがありますMSVCで問題が発生しているかどうかはわかりません。 – TartanLlama