2017-01-12 53 views
3

假設複製構造函數和複製賦值運算符沒有副作用,無論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提供相同的結果。

+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

相關問題