lambda与初始化器本身相当于没有初始化器的lambda吗?

时间:2017-01-12 09:58:32

标签: c++ lambda shared-ptr

假设复制构造函数和复制赋值运算符没有副作用,以下两个代码片段是否相同,无论response的类型和限定符是什么?

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会产生相同的结果。

1 个答案:

答案 0 :(得分:2)

这似乎是编译器的一个问题。最新的VisualC ++ v19.10.24903.0将编译它。您可以在线试用here