这个左值返回危险吗

Is this lvalue returning dangerous?

本文关键字:危险 返回      更新时间:2023-10-16

我有这个代码:

struct Base {};
struct Derived : public Base {
  int somedata;
};
std::unique_ptr<Base> createTemporary() {
  return std::make_unique<Derived>(); // This code has been simplified
}
template<typename T>
T& convertValueTo(std::unique_ptr<Base>&& obj) {
 return static_cast<T&>(*obj); 
}
int main() {
    int data = convertValueTo<Derived>(createTemporary()).somedata;
    return 0;
}

我设计了convertValueTo模板函数来返回所要求的对象类型,主要用于等函数调用

auto some_value = convertValueTo<Something_Else>(createTemporary()).a_member_variable;

现在我在想。。有更安全的方法吗?如果有人使用从convertValueTo返回的引用,那么只要行表达式结束,临时引用就会被销毁,对吗?

我的目标是:

  • 允许使用临时的,并在引用未存储的情况下尽快销毁(如上所述)
  • 允许安全引用绑定到有效对象,以防有人想要

转换为所需类型的unique_ptr。然后就清楚了谁拥有动态创建的对象的所有权,即从转换函数返回的unique_ptr。一旦您为动态创建的对象创建了一个左值引用,该引用就有可能在对象的生存期内继续存在。

#include <memory>

struct Base {};
struct Derived : public Base {
  int somedata;
};
std::unique_ptr<Base> createTemporary() {
  return std::make_unique<Derived>(); // This code has been simplified
}
template<typename T>
std::unique_ptr<T> convertValueTo(std::unique_ptr<Base>&& obj) {
  auto ptr = obj.release ();
  return std::unique_ptr<T> { static_cast<T*>(ptr) }; 
}
int main() {
  int data = convertValueTo<Derived>(createTemporary())->somedata;
  return 0;
}