我有这段代码:
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
返回的引用,那么一旦行表达式结束,临时将被销毁?
我的目标是:
答案 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;
}