假设复制构造函数和复制赋值运算符没有副作用,以下两个代码段是否完全相同,不考虑
看起来这个问题需要使用
如果需要的话,我使用MSVC 2015并以Debug x86编译,但我认为将其编译为Release或x64会得到相同的结果。
response
的类型和限定符?auto foo = [response]() {
do_something(response);
};
And
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));
}
看起来这个问题需要使用
std::shared_ptr
作为response
,但我不确定原因。我知道复制一个shared_ptr
并不会复制实际的资源(如int
),但我无法理解它如何导致代码无法编译。我一直认为前两个代码片段完全相同。如果需要的话,我使用MSVC 2015并以Debug x86编译,但我认为将其编译为Release或x64会得到相同的结果。