You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

默认构造函数调用含unique_ptr移动的同类构造函数报错求解

解决构造函数委托时的unique_ptr引用绑定错误

嘿,我来帮你捋清楚这个问题!你遇到的编译器错误,根源在于非const左值引用无法绑定到右值。

你的参数化构造函数用了unique_ptr<int>&(非const左值引用)作为参数,但make_unique<int>(54)返回的是一个临时的unique_ptr对象——也就是C里的"右值",C规则明确禁止把非const左值引用绑到右值上,这就是报错的原因。

另外顺便提一句:你原来的print()函数打印的是m_number,这会输出指针的内存地址,不是存储的数值54,得改成*m_number才能得到正确结果。

下面给你两种简洁的解决方案,都能实现你想要的构造函数委托,避免重复初始化代码:

方案1:把参数改成右值引用

直接将参数化构造函数的参数改为右值引用unique_ptr<int>&&,这样就能直接接收make_unique返回的临时对象:

#include <string>
#include <iostream>
#include <memory>
using namespace std;

class Foo {
public:
    // 参数改为右值引用,适配临时对象
    Foo(unique_ptr<int>&& number) : m_number(move(number)) { }
    // 委托构造直接传递右值
    Foo() : Foo(make_unique<int>(54)) { }
    // 解引用指针,打印实际数值
    void print() { cout << *m_number << endl; }
private:
    unique_ptr<int> m_number;
};

int main() {
    Foo f;
    f.print(); // 现在会输出54
    return 0;
}

方案2:使用值传递参数

如果希望构造函数同时支持接收左值和右值,也可以用值传递参数,内部再把参数move到成员变量里:

#include <string>
#include <iostream>
#include <memory>
using namespace std;

class Foo {
public:
    // 值传递参数,兼容左值和右值
    Foo(unique_ptr<int> number) : m_number(move(number)) { }
    Foo() : Foo(make_unique<int>(54)) { }
    void print() { cout << *m_number << endl; }
private:
    unique_ptr<int> m_number;
};

int main() {
    // 示例:传递左值的情况
    unique_ptr<int> my_ptr = make_unique<int>(100);
    Foo f2(move(my_ptr)); // 需要用move把左值转成右值
    f2.print(); // 输出100
    
    Foo f;
    f.print(); // 输出54
    return 0;
}

这两种方案都完美实现了你的需求:用默认构造函数委托参数化构造函数,完全避免了重复的初始化逻辑,代码简洁清晰。

内容的提问来源于stack exchange,提问作者Marnix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 13:27:54