假設複製構造函數和複製賦值運算符沒有副作用,無論response
的類型和限定符如何,以下兩個代碼片段是否相同?帶初始值設定項的lambda是否等於沒有初始值設定項的lambda?
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
),但我無法瞭解它是如何導致代碼無法編譯的。我始終認爲,前兩個代碼片段完全一樣。
如果需要的話,我使用MSVC 2015並使用Debug x86進行編譯,但我認爲將其編譯爲Release或x64提供相同的結果。
評論版本適合我在gcc和clang上使用。這可能是一個編譯器錯誤。 – user2079303
[有案例](http://stackoverflow.com/a/36188986/3953764)其中用於捕獲變量的語法很重要,它們都不適用於您的代碼 –
名稱查找的工作方式有所不同對於這兩種形式,不確定是否會導致MSVC的問題。 – TartanLlama