2017-01-12 54 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

相关问题