如何防止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
相关产品推荐
相关产品推荐

