如何实现返回rvalue的工厂函数以测试C++成员函数的reference qualifiers
你当前类内声明的返回widget_12&&的成员工厂函数写法存在悬垂引用风险,无法安全实现你的需求,正确实现方式如下:
方案1:非成员工厂函数(最常用)
直接按值返回widget_12对象即可,C++中函数按值返回的临时对象属于纯右值,会自动匹配右值引用限定的dowork重载:
// 类定义外实现工厂函数 widget_12 make_widget() { return widget_12{}; }
调用make_widget().dowork()就会触发右值版本的成员函数执行。
方案2:类内静态成员工厂函数
如果希望工厂函数归属类作用域,可以声明为静态成员,同样按值返回:
class widget_12 { public: // 你原有dowork的实现不变 void dowork()& { std::cout << "*this is lvalue\n"; }; void dowork()&& { // 注意你原代码这里拼写错误,rvlaue应为rvalue std::cout << "*this is rvalue\n"; }; // 静态工厂函数 static widget_12 make_widget() { return widget_12{}; } };
调用时写widget_12::make_widget().dowork()即可。
完整测试示例
#include <iostream> class widget_12 { public: void dowork()& { std::cout << "*this is lvalue\n"; } void dowork()&& { std::cout << "*this is rvalue\n"; } static widget_12 make_widget() { return widget_12{}; } }; int main() { widget_12 lval_obj; lval_obj.dowork(); // 左值对象调用左值版本,输出*this is lvalue widget_12::make_widget().dowork(); // 右值临时对象调用右值版本,输出*this is rvalue return 0; }
注意:不要实现返回局部对象的右值引用/左值引用的工厂函数,会产生悬垂引用,触发未定义行为。
内容的提问来源于stack exchange,提问作者Michał Turek
相关产品推荐
相关产品推荐

