c – 为什么不能自动使用模板类型参数?

前端之家收集整理的这篇文章主要介绍了c – 为什么不能自动使用模板类型参数?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在玩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);
};

猜你在找的C&C++相关文章