【问题标题】:Is lambda with initializer to itself equivalent to lambda without initializer?带有初始化器的 lambda 是否等同于没有初始化器的 lambda?
【发布时间】:2017-01-12 19:11:51
【问题描述】:

假设复制构造函数和复制赋值运算符没有副作用,以下两个代码sn-ps是否相同,无论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),但我看不出它如何导致代码无法编译。我一直认为前两个代码 sn-ps 做的事情完全一样。

如果需要,我使用 MSVC 2015 并使用 Debug x86 对其进行编译,但我认为将其编译为 Release 或 x64 会产生相同的结果。

【问题讨论】:

  • 注释版本在 gcc 和 clang 上都适用于我。这可能是编译器错误。
  • There are cases 用于捕获变量的语法很重要,它们似乎都不适用于您的代码
  • 这两种形式的名称查找方式有所不同,不确定这是否会导致 MSVC 出现问题。

标签: c++ lambda shared-ptr


【解决方案1】:

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

【讨论】:

  • 似乎是这样。我刚刚在网上测试了here,问题也存在。
  • @Bernard 完全是 :)
猜你喜欢
  • 2020-03-05
  • 1970-01-01
  • 2016-03-11
  • 2023-04-02
  • 2015-03-04
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
相关资源
最近更新 更多