我对这个程序有疑问:
struct A {};
int main()
{
::std::vector< ::std::unique_ptr<A> > v;
::std::cout << ::std::is_copy_constructible<decltype(v)>{} << ::std::endl;
//decltype(v) w(v);
return 0;
}
输出:
1
然而,如果我取消注释注释行,程序将无法编译。您是否认为,标准中存在错误,::std::is_copy_constructible<decltype(v)>{}
评估为true
以及标准中的位置?例如,如果value_type
不可复制,应该修复元函数,还是容器应该删除它的复制构造函数?
variant
,它包含一个用不可复制的value_type
实例化的容器类模板。 variant
可以SFINAE
远离方法来复制容器并避免编译错误,但由于它从STL
收到错误的信息,因此它不能。由于这个问题,我不得不编写一个特殊的moving_variant
类模板,它只移动,从不复制,而它可能/应该可以有一个variant
类模板。 / p>
答案 0 :(得分:7)
is_copy_constructible
是根据is_constructible
定义的,如果像这样的表达式格式正确,则为真:
T t(create<const T&>())
在vector<unique_ptr>
的情况下,这是格式良好的,因为vector
声明了一个合适的复制构造函数。构造函数无法实例化,因为它使用了已删除的函数;但是在像这样的未评估的上下文中使用时,模板不会被实例化。