gpt4 book ai didi

c++ - 如何在 C++ 中将不可复制的局部变量移出 lambda?

转载 作者:搜寻专家 更新时间:2023-10-31 00:31:04 24 4
gpt4 key购买 nike

我想实现一个简单的运行时检查宏,所以它的工作方式如下:

CHECK(expr) << "Some problem!";

我为此编写了一个简化的日志记录类:

class Log {
public:
Log() = default;
Log(const Log&) = delete;

~Log() {
cout << this << " dtor" << endl;
cout << stream_.str() << endl;
}

template <class T>
Log& operator<<(const T& info) {
cout << this << " <<" << endl;
stream_ << info;
return *this;
}

private:
stringstream stream_;
};

让宏为:

#define CHECK(expr) \
if (!(expr)) [] { /* See attempts below */ }()

现在让我们尝试实现 lambda。


尝试 #1

最简单的方法应该是:

[] {
Log log;
log << "A";
return log;
}

但是no luck - 复制构造函数被删除:

error: use of deleted function 'Log::Log(const Log&)'

尝试 #2

好吧,让我们明确地 move 局部变量:

[] {
Log log;
log << "A";
return move(log);
}

嗯,还是no luck .

尝试 #3

绝望的尝试当然不应该成功:

[]() -> Log&& {
Log log;
log << "A";
return move(log);
}

它编译甚至 runs ,但是 operator <<在析构函数之后调用:

0xbfe84064 dtor
A
0xbfe84064 <<

帮我弄清楚我在从 lambda 返回变量时做错了什么?

最佳答案

使 move 构造函数默认,即

Log(Log&&) = default;

因为否则存在用户提供的复制构造函数(即使 deleted)disables the move ctor .您还应该使用 return log; 而不是 return move(log);,因为默认的 move ctor 将被调用(因为复制 ctor 已被删除)。参见例如this有关为什么通常应避免 return move 的更多详细信息。

Live on Coliru

关于c++ - 如何在 C++ 中将不可复制的局部变量移出 lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34979453/

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