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

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

概述我一直在玩C 0x的auto关键字,并尝试了以下. std::unique_ptr<auto> ptr(new int(0)); 我试过用g.4.5.5编译,并得到 error: invalid use of auto 通过眼睛来看,汽车可以很容易地推断为int. 我的猜测是类型推断,模板引擎不要彼此交谈.否则,模板引擎将知道用int作为类型参数实例化模板类. 另一个猜测是从标准,我看到这一点. 我一直在玩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 – 为什么不能自动使用模板类型参数?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1251087.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存