假设复制构造函数和复制赋值运算符没有副作用,无论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