use*_*108 13 c++ containers stl language-lawyer c++11
我有这个程序的问题:
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;
}
Run Code Online (Sandbox Code Playgroud)
这输出:
1
Run Code Online (Sandbox Code Playgroud)
但是,如果我取消注释注释行,程序将无法编译.您是否认为,标准中的错误是::std::is_copy_constructible<decltype(v)>{}评估true标准中的哪个位置?例如,应该修复元函数,还是容器应该删除它的复制构造函数,如果value_type它不可复制?
编辑:我想我应该澄清为什么这很重要.比如说,你有一个类模板variant,它包含一个用不可复制的实例化的容器类模板value_type.该variant能SFINAE走法是复制的容器,避免编译错误,但因为它从接收信息错误STL,它不能.由于这个问题,我不得不写一个特殊的moving_variant类模板,它只移动,从不复制,而它可能/应该可以有一个variant类模板.
is_copy_constructible是按照这样定义的is_constructible,如果这样的表达式格式正确,则为真:
T t(create<const T&>())
Run Code Online (Sandbox Code Playgroud)
在这种情况下vector<unique_ptr>,这是格式良好的,因为vector声明了一个合适的拷贝构造函数.构造函数无法实例化,因为它使用了已删除的函数; 但是在这样的未评估上下文中使用时,模板不会被实例化.
| 归档时间: |
|
| 查看次数: |
404 次 |
| 最近记录: |