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

如何实现返回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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:57:03