STD::任何无法复制构造的对象

问题描述 投票:0回答:1
我有一个具有唯一_ptr的对象,因此不能在不进行深层副本的情况下构造复制(我不想)。 我想拥有该对象,但是我发现的唯一选择是制作

std::any

握住指针,该指针添加了无用的间接,或者使我的对象具有独特的PTR。代码Bellow希望可以说明我的观点:

std::any
据我了解,
//Compiled with clang++ -std=c++2a; clang version 5.0.0 #include <iostream> #include <any> #include <memory> struct A { std::unique_ptr<int> m = std::make_unique<int>(11); A(A&& a): m(std::move(a.m)) {} A() {} }; struct B { std::shared_ptr<int> m = std::make_shared<int>(11); }; template<class T> void use_any_ptr() { std::any a{new T{}}; std::cout << *(std::any_cast<T*>(a)->m) << std::endl; } template<class T> void use_any() { std::any a{T{}}; std::cout << *(std::any_cast<T>(a).m) << std::endl; } int main() { use_any_ptr<A>(); // Workaround using a pointer use_any<B>(); // Workaround using shared pointer use_any<A>(); // Breaks because A has no cc no matching constructor for initialization of 'std::any' }

似乎需要复制对象,但是我不确定为什么不能简单地移动对象。
有一种方法可以解决这个问题吗?也就是说,除了使用共享_ptr之外据我所知,通往与之相处的类型的无效指针)。
是否有不同的实现可以在创建时使用MOVE CTR而不是复制CTR的实现?

或我在这里很愚蠢,不了解这里的“真实”问题?

	

或我在这里很愚蠢,不了解这里的“真实”问题?

问题很简单:
std::any
具有复制构造函数,因此需要包含的对象是复制的构造。

通过定义一个包含指针的自定义对象,可以复制并且实现

proper

逻辑(无论您的情况下,我都看不到如何看待如何,复制一个拥有一个

std::any

的对象,因此复制一个物体,但也许您可以在某种程度上以某种方式摆脱它)。
c++ templates c++17 template-meta-programming stdany
1个回答
5
投票
std::any
的需求。它确实没有太多用途,也许您可以使用一些模板机械或

std::any

或其他

尽管只能包含

std::any
类型,但仅在您实际尝试复制它时才调用复制构造函数。因此,只要您从不复制std::unique_ptr,您实际上就不需要功能复制构造函数。

我们可以通过编写一个复制构造函数来利用它,该复制构造函数如果调用:

std::any 输出:

std::variant
您可以将其与非 -
std::any
,非

CopyConstructible

包装器结合在一起,因此您在运行时不会感到惊讶。

	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.