c++ - 返回 "chained"对象时移动构造函数

标签 c++

假设我有一个只能移动的类,并且这个类有“链接”的方法。示例:

struct C {
    C() = default;
    C(C const&) = delete;
    C(C&&) = default;

    C& chained() {
        return *this;
    }

    int a;
};

C foo(C c) {
    return c.chained();
}

int main()
{
  auto o = foo(C{});
}

我在 foo 的返回语句中收到错误消息:“使用已删除的函数‘C::C(const C&)’”。

为什么要尝试调用复制构造函数?它不应该使用 move 构造函数,因为它是 return 语句吗?

最佳答案

Why is trying to call the copy constructor? Shouldn't it be using the move constructor since its a return statement?

没有。您指的是并误解了 copy elision (关于 NRVO)。只有当返回的表达式是一个 id-expression(只是一个名称),它引用函数参数列表中的对象或本地对象时,才会首先尝试移动。

您不返回 id 表达式,您的表达式是调用成员函数的结果。

关于c++ - 返回 "chained"对象时移动构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52872578/

相关文章:

c++ - LLVM 中间表示 : fptoui vs. fptosi

c++ - unordered_set 将元素存储为指针

c++ - vector 迭代器和停止条件

c++ - 运行时检查实例 (Base*) 是否覆盖父函数 (Base::f())

c++ - 如何在非托管 C++ 应用程序中托管许可的 .Net 控件?

c++ - 字符串相等时比较不相等

c++ - 为什么这个 constexpr 函数格式错误?

c++ - QTabBar滚动条分离

c++ - boost Asio 和 OpenSSL 1.1.0

C++ Big for循环在它应该之前随机停止