c++ - 当移动构造函数声明为私有(private)时使用复制构造函数

标签 c++ compiler-construction constructor

假设给定的类A是使用公共(public)复制构造函数和私有(private)移动构造函数定义的。如果函数f返回A类型的对象,并且f用于初始化A<类型变量的本地实例,那么默认情况下(因为返回的值是右值)编译器将尝试使用移动构造函数。我相信,一旦编译器检测到移动构造函数是私有(private)的,期望编译器使用复制构造函数是明智的,但令我惊讶的是,我收到了一个编译器错误,指出移动构造函数是私有(private)的。我的问题如下,给出以下代码:

 #include<iostream>

 using namespace std;

 class A
 {

    friend A f();

 public:
    A(const A&) { cout << "copy\n"; }


 private:
    A() {}
    A(A&&) { cout << "move\n"; }
 };

 A f()
 {
    A a;
    return a;
 }

 int main()
 {
    A a = f();
 }

如何更改代码(不更改 A 或 f),以便可以使用复制构造函数初始化 main 中的变量?

最佳答案

我会改变这个类,因为它不合理。

或者从类派生或包装它。

如果你只是想快速破解,你可以这样做

template< class Type >
Type& tempref( Type&& t ) { return t; }

然后做

A a = tempref( f() )

免责声明:编译器未触及代码。

关于c++ - 当移动构造函数声明为私有(private)时使用复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12981079/

相关文章:

java - 'new'关键字在Java中实际上有什么作用,应该避免创建新对象吗?

c++ - C/C++ 3维数组如何存储在内存中以及遍历它的最快方法是什么

c++ - 计数但小错误

c++ - 用 "%20"替换空格 - 字符串下标超出范围

c++ - 为什么需要为每个 Visual C++ 版本构建特殊的库(二进制文件)?

coldfusion - 关于 ColdFusion 组件构造函数名称的问题

C++ 构造函数错误。无法初始化字符串数组

c++ - 退出功能不起作用

java - 如何在Java程序中调用Rhino编译的JavaScript方法(类文件)?

c++ - 在 C++ 中如何发生堆栈下溢?