gpt4 book ai didi

c++ - 带有初始化器的 lambda 是否等同于没有初始化器的 lambda?

转载 作者:太空狗 更新时间:2023-10-29 21:35:45 26 4
gpt4 key购买 nike

假设复制构造函数和复制赋值运算符没有副作用,无论 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 会得到相同的结果。

最佳答案

这似乎是编译器的问题。最新的 Visual C++ v19.10.24903.0 将编译它。可以在线试一下here .

关于c++ - 带有初始化器的 lambda 是否等同于没有初始化器的 lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41610072/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com