默认构造函数调用含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
相关产品推荐
相关产品推荐

