微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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);
};

原文地址:https://www.jb51.cc/c/113275.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐