【问题标题】:Does assigning return value from a lambda cause a copy?从 lambda 分配返回值会导致复制吗?
【发布时间】:2021-06-09 14:09:47
【问题描述】:

我以前使用过这种模式来进行特定于模块的初始化,例如在 .cpp 文件的顶部:

static bool isInitialized = []()
{
    ...//do stuff
    return true;
}();

但是像这样的东西呢:

static MyObject something = []()
{
    MyObject ret(...);
    ret.x(...)
    return ret;
}();

如果something ret 或将是一个副本,这是确定的吗?我想避免抄袭。

我主要使用 VS2017/C++14,不过很快就会转向 C++17。

【问题讨论】:

    标签: c++ c++17 c++14


    【解决方案1】:

    案例一不应是 C++17 中的副本。您正在返回一个纯右值,因此不会创建临时值,而是直接构造 isInitialized。在 C++14 中,这只是一个可选的优化。

    案例 2 使用命名变量,因此您必须依赖 NRVO(在任何版本的 C++ 中都不能保证)来进行优化。在“加号”方面,函数本地参数在 return 语句中被视为右值,因此 ret 将在可以移动时被移动,并且仅在不能时复制。

    【讨论】:

    • 从积极的方面来说,有一个保证 NRVO 的提案。对于 OP,您可以检查是否调用了复制构造函数。编译器资源管理器的一个简单示例(尽管使用现代版本的 MSVC)表明确实会发生复制省略 (NRVO)。
    猜你喜欢
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 2016-06-13
    • 1970-01-01
    相关资源
    最近更新 更多