Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在返回“时移动构造函数”;“链锁”;对象_C++ - Fatal编程技术网

C++ 在返回“时移动构造函数”;“链锁”;对象

C++ 在返回“时移动构造函数”;“链锁”;对象,c++,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 =

假设我有一个只移动的类,这个类有一个“链”的方法。例如:

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的return语句中得到一个错误:“使用已删除的函数'C::C(const C&')”

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

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

不。你指的是,并且误解了(关于NRVO)。只有当返回的表达式是引用函数参数列表中的对象或本地对象的id表达式(只是名称)时,才会首先尝试移动


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

那么,我可以将返回值包装在
std::move()
中吗?或者我是在强迫编译器接受它试图保护我的东西吗?@baruch-这不是为了保护你,而是为了在应用可能破坏的优化时保持保守。如果知道引用是指向可以从中移动的对象,则可以显式应用移动。编译器不会自己做这件事。