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

如何防止prvalue被绑定到变量?C++临时对象生命周期管控

解决方案:禁止临时转换对象被拷贝/移动

要阻止IntOrChar对象被保存(即禁止将get()返回的临时对象赋值给变量),核心思路是禁用该类的拷贝与移动语义,让它只能作为临时对象存在,必须立即完成类型转换。

修改后的代码实现

#include <iostream>
#include <string>

class MyData {
private:
    class IntOrChar {
    public:
        IntOrChar(char const& c) : c_(c) {}

        // 保留隐式转换,确保能直接传给接受char/int的函数
        operator char() { return c_; }
        operator int() { return c_ - '0'; }

        // 禁用拷贝、移动构造
        IntOrChar(const IntOrChar&) = delete;
        IntOrChar(IntOrChar&&) = delete;

        // 禁用拷贝、移动赋值
        IntOrChar& operator=(const IntOrChar&) = delete;
        IntOrChar& operator=(IntOrChar&&) = delete;

    private:
        char const& c_;
    };

public:
    MyData(std::string number) : number_(std::move(number)) {}

    IntOrChar get(std::size_t i) { return number_[i]; }

private:
    std::string number_;
};

void accepts_char(char c) { std::cout << "char: " << c << '\n'; }
void accepts_int(int i) { std::cout << "int: " << i << '\n'; }

int main(){
    MyData n("012345");
    // 正常工作:临时对象直接转换为目标类型
    accepts_char(n.get(3));
    accepts_int(n.get(3));

    // 编译报错:无法拷贝/移动IntOrChar对象,阻止危险操作
    // auto r = n.get(2);
    // accepts_char(r);

    // 若确实需要保存结果(安全,保存的是转换后的值而非引用)
    char saved_char = n.get(2);
    int saved_int = n.get(2);
    accepts_char(saved_char);
    accepts_int(saved_int);
}

原理说明

  • 当IntOrChar的拷贝/移动构造、赋值运算符被delete后,编译器会直接拒绝任何试图将临时IntOrChar对象保存到变量的操作,从根源上避免后续引用失效的风险。
  • 直接传递给accepts_char或accepts_int的操作不受影响:临时IntOrChar对象会直接调用转换运算符,将结果传递给函数,全程不需要拷贝/移动对象。
  • 如果确实需要保存结果,可以显式转换为char或int类型保存,此时保存的是具体值而非内部引用,不存在失效问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 03:45:13