我一直在玩C 0x的auto关键字,并尝试了以下.
std::unique_ptr<auto> ptr(new int(0));
我试过用g.4.5.5编译,并得到
error: invalid use of auto
通过眼睛来看,汽车可以很容易地推断为int.
我的猜测是类型推断,模板引擎不要彼此交谈.否则,模板引擎将知道用int作为类型参数实例化模板类.
另一个猜测是从标准,我看到这一点.
A member shall not be declared with auto,extern or register storage class.
但是我认为这是auto在局部变量中,而不是像自动用来推断类型.
而我最后的猜测是,编译器认为这是一个自动存储类,而不是自动的类型扣除.
标准中是否有这样的理由?
解决方法
@dascandy已经正确地识别出你的代码有什么问题.我会尝试提供一些理由:
您期望编译器推断unique_ptr< int>因为参数是一个int *,而unique_ptr< int>有一个接受int *的构造函数.有一会儿我们忽略了我们使用std :: unique_ptr这个事实,只是谈一下我们写的(可以专门化)的模板类.
为什么编译器推断unique_ptr< int>?参数不是int,它是int *.为什么不应该猜到unique_ptr< int *>?当然这会导致编译错误,因为unique_ptr< int *>的构造函数不会接受一个int *.除非我加入专业:
template<> class unique_ptr<int*> { public: unique_ptr(int*) {} };
现在unique_ptr< int *>会编译编译器应该知道要选择哪一个,unique_ptr< int>或unique_ptr< int *>?如果我添加另一个专业化怎么办?
template<> class unique_ptr<double> { public: unique_ptr(int*) {} };
编译器现在有三个可供选择的选项,它必须用每个可能的参数实例化模板,以便找到它们.显然这是不可行的,特别是对于多个模板参数和模板递归.
你可以做的是制作工厂功能,将推断的类型与一个模板实例相连:
template<typename T> std::unique_ptr<T> make_unique(T* arg) { return arg; }
(当然这不行,因为unique_ptr不能被复制,但是这个想法是有效的,用在egmake_shared和make_pair中.)
一些极端丑陋的例子:
可以认为unique_ptr< shared_ptr< int>>>是此代码的有效匹配项.
或者怎么样?
template<typename T> class unique_ptr { public: explicit unique_ptr(T* arg); unique_ptr(int*,enable_if<(sizeof(T) > 16)>::type* = 0); };