c – 模板扣除,这符合吗?

c – 模板扣除,这符合吗?,第1张

概述看起来这个代码不正确,因为我得到编译器错误.我试图理解为什么: template <class ... Ts>struct type_list{};template <class ... Ts, class T_, class ... Ts_>auto foo(type_list<Ts...>, Ts&&..., T_&&t, Ts_&&...) { return sizeof(T 看起来这个代码不正确,因为我得到编译器错误.我试图理解为什么:

template <class ... Ts>struct type_List{};template <class ... Ts,class T_,class ... Ts_>auto foo(type_List<Ts...>,Ts&&...,T_&&t,Ts_&&...) {    return sizeof(T_);}int main() {  std::cerr << foo(type_List<int>{},5,5.0,3);  return 0;}

clang产生以下错误:

example.cpp:16:16: error: no matching function for call to 'foo'  std::cerr << foo(type_List<int>{},3);               ^~~example.cpp:11:6: note: candIDate template ignored: deduced conflicting types for parameter 'Ts'      (<int> vs. <>)auto foo(type_List<Ts...>,Ts_&&...) {

在我看来,在我的调用中Ts应该被推导为int(因为这是使第一个参数解决的唯一方法),然后其他一切都将被强制作为结果.为什么这不起作用?

解决方法 Clang从两个相互矛盾的来源中推断出Ts:type_List< Ts ...>和Ts&& ….因为你用type_List< int> {}调用foo,所以Ts首先推导为{int}.但是,因为最后一个参数Ts_&& …具有参数包的类型,所以它可以捕获所有它;在这种情况下,最后两个参数(T_&& t传递给5),它将Ts_推导为{double,int}(和T_作为int).这使Ts没有参数,因此它被推导为{}.

因此,Clang的错误消息:Ts被推断为{}和{int}(错误消息中的(< int> vs.<>)).

请注意,GCC以不同的方式做事:

error: too few arguments to function ‘auto foo(type_List,Ts&& …,T_&&,Ts_&& …) [with Ts = {int}; T_ = int; Ts_ = {double,int}]’

它试图将Ts推导为{int},但仍将Ts_推导为{double,int},因此无法给出正确数量的参数.

要进一步解释,请考虑以下事项:

template <class ... Ts>struct type_List{};template <class ... Ts>auto foo(type_List<Ts...>,Ts...) {    return sizeof...(Ts);}int main() {  std::cerr << foo(type_List<int>{},3);}

Clang正确地调用了这个,因为两个推论是冲突的:

note: candIDate template ignored: deduced conflicting types for parameter ‘Ts’ (<int> vs. <int,double,int>)

麻烦的是,你不能用另一个参数包捕获2个参数,因为如果放在后面(这是你的情况),它将捕获所有内容,如果放在之前没有任何内容:

template <class ... Ts>struct type_List{};template <class... Ts,class... Ts_>auto foo(type_List<Ts...>,Ts_...,3);}

在这里,Clang产生相同的错误消息,因为Ts仍然被推断为type_List中的{int}和{int,通过捕获所有剩余的参数.

我认为你唯一的选择是以某种方式处理元组或更明确地调用:foo< int>(type_List< int> {},3)(在这种情况下你可以删除type_List).这样,Ts就不再推断出来了:你明确地把它变成了{int}.

总结

以上是内存溢出为你收集整理的c – 模板扣除,这符合吗?全部内容,希望文章能够帮你解决c – 模板扣除,这符合吗?所遇到的程序开发问题。

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

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

原文地址: https://outofmemory.cn/langs/1212153.html

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

发表评论

登录后才能评论

评论列表(0条)

保存