这个左值是否有危险?

时间:2015-12-18 20:47:42

标签: c++ templates c++14

我有这段代码:

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返回的引用,那么一旦行表达式结束,临时将被销毁?

我的目标是:

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

1 个答案:

答案 0 :(得分:0)

转换为所需类型的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;
}