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&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...