`std::any_cast<T>` 是否要求`T` 是可构造的,即使在请求指针时也是如此?
Does `std::any_cast<T>` require `T` to be constructible even when asked for a pointer?
我想std::any
包含std::vector<std::unique_ptr<T>>
。
class Foo {
public:
Foo() = default;
~Foo() = default;
Foo(const Foo&) = default;
Foo(Foo&&) = default;
Foo& operator=(const Foo&) = default;
Foo& operator=(Foo&&) = default;
virtual void bar() = 0;
};
void f() {
using std::any;
using std::any_cast;
using std::unique_ptr;
using std::vector;
using V = vector<unique_ptr<Foo>>;
any a(V());
V* v = any_cast<V>(&a);
}
根据 the document,std::any_cast<T>(&a)
似乎 return V*
。我认为这不会复制包含的对象。
但是当我尝试编译上面的代码时,出现了以下错误:
/usr/include/c++/8/bits/stl_construct.h:75:7: error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = Foo; _Dp = std::default_delete<Foo>]’
{ ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
是否意味着 std::any_cast<V>(&a)
需要 V
才能构造? std::any_cast
是否复制包含的对象,即使只是要求一个指针?如果是,为什么需要复制内容?
std::any
使用类型擦除技术。这意味着在擦除类型时必须检测到对已擦除类型施加的任何要求。这与模板类型不同,模板类型可以在您调用实际使用这些要求的函数时评估要求。
因此,即使您不做真正需要它的事情,any
仍然会强加这些要求。
话虽如此,在这种情况下,您 正在 做真正需要它的事情。即,any a(V());
。它会将对象复制到 a
的内部存储中。请记住:您不能通过函数参数进行复制省略。
我想std::any
包含std::vector<std::unique_ptr<T>>
。
class Foo {
public:
Foo() = default;
~Foo() = default;
Foo(const Foo&) = default;
Foo(Foo&&) = default;
Foo& operator=(const Foo&) = default;
Foo& operator=(Foo&&) = default;
virtual void bar() = 0;
};
void f() {
using std::any;
using std::any_cast;
using std::unique_ptr;
using std::vector;
using V = vector<unique_ptr<Foo>>;
any a(V());
V* v = any_cast<V>(&a);
}
根据 the document,std::any_cast<T>(&a)
似乎 return V*
。我认为这不会复制包含的对象。
但是当我尝试编译上面的代码时,出现了以下错误:
/usr/include/c++/8/bits/stl_construct.h:75:7: error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = Foo; _Dp = std::default_delete<Foo>]’
{ ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
是否意味着 std::any_cast<V>(&a)
需要 V
才能构造? std::any_cast
是否复制包含的对象,即使只是要求一个指针?如果是,为什么需要复制内容?
std::any
使用类型擦除技术。这意味着在擦除类型时必须检测到对已擦除类型施加的任何要求。这与模板类型不同,模板类型可以在您调用实际使用这些要求的函数时评估要求。
因此,即使您不做真正需要它的事情,any
仍然会强加这些要求。
话虽如此,在这种情况下,您 正在 做真正需要它的事情。即,any a(V());
。它会将对象复制到 a
的内部存储中。请记住:您不能通过函数参数进行复制省略。