C++ 具有初始值设定项的lambda是否等同于不具有初始值设定项的lambda?

C++ 具有初始值设定项的lambda是否等同于不具有初始值设定项的lambda?,c++,lambda,shared-ptr,C++,Lambda,Shared Ptr,假设复制构造函数和复制赋值运算符没有副作用,则无论响应的类型和限定符如何,以下两个代码段是否相同 auto foo = [response]() { do_something(response); }; 及 它们似乎做了完全相同的事情——复制对象响应——但在某些情况下,只有第二个版本可以编译 下面是一个示例程序来演示该问题: #include <memory> using namespace std; void do_something() { } int main() {

假设复制构造函数和复制赋值运算符没有副作用,则无论
响应的类型和限定符如何,以下两个代码段是否相同

auto foo = [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));
}
#包括
使用名称空间std;
空做某事{
}
int main(){
自动au=[](自动回调){
回调();
};
自动x=[&au](共享的ptr响应){
au([response=move(response)]()可变{
自动foo=[response/*=response*/](){//uncomment,它会工作的
做某事;
};
});
};
x(使_共享(100));
}
似乎
response
必须是
std::shared\u ptr
才能发生此问题,但我不确定原因。我理解复制
共享\u ptr
不会复制实际资源(即
int
),但我看不出这可能导致代码无法编译。我一直认为前两个代码片段做的事情完全相同


如果需要的话,我会使用MSVC 2015并用Debug x86编译它,但我认为将它编译为发行版或x64会得到相同的结果。

这似乎是编译器的问题。最新的VisualC++
v19.10.24903.0
将对其进行编译。你可以在网上试试。

评论过的版本在gcc和clang上都适用。这可能是一个编译器错误。如果用于捕获变量的语法很重要,那么它们似乎都不适用于您的代码。这两种表单的名称查找工作方式存在差异,不确定这是否导致MSVC出现问题。看起来是这样的。我刚在网上测试过,问题也存在。@Bernard:)
#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));
}