首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何替代扣减可以产生多个可能的“推导A"?

如何替代扣减可以产生多个可能的“推导A"?
EN

Stack Overflow用户
提问于 2022-08-13 08:43:52
回答 2查看 135关注 0票数 1

[temp.deduct.call]/5

这些替代方案([temp.deduct.call]/4)只有在类型扣减失败时才会考虑。如果产生多个可能推导的A,则类型推导失败。注意:如果在函数模板的任何函数参数中没有使用模板参数,或者仅在非推导的上下文中使用,则不能从函数调用中推导出相应的模板参数,而且必须显式指定模板参数。-尾注

我的问题:

  • 这些替代的扣减如何能产生多个可能的“推断A"?

请用一个触发这种情况的例子来支持这个答案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-15 12:48:00

代码语言:javascript
复制
template<typename>
struct B {};

struct D : B<int>, B<double> {};

template<typename T>
void f(B<T>);

int main()
{
    f(D{});
}

[temp.deduct.call]/(4.3)

如果P是一个类,而P具有简单模板id的形式,则转换后的A可以是导出A的派生类D

适用于此,并且可以推导出两个AB<int>B<double>。所以类型推断失败了。

额外的例子:与过载解决方案的交互:

代码语言:javascript
复制
template<typename>
struct A {};
template<typename>
struct B {};

struct D1 : A<int>, B<int> {};
struct D2 : A<int>, B<int>, B<double> {};

template<typename T>
void f(A<T>); // 1
template<typename T>
void f(B<T>); // 2

int main()
{
    f(D1{}); // error, ambiguous between 1 and 2
    f(D2{}); // calls specialization of 1, because deduction for 2 fails
}
票数 5
EN

Stack Overflow用户

发布于 2022-08-13 08:53:12

这些替代的演绎如何能够产生多个可能的“推导A"?,请用一个触发这个案例的例子来支持这个答案。

这方面的一个例子是:

代码语言:javascript
复制
template<typename T> 
void f(T a, T b)
{
    
}
int main()
{
    f(3, 5.5); //deduced A as int from first deduction while double from second deduction
    return 0;
}

这里我们有多个可能的“推导A”。从第一个参数,我们有int,从第二个参数,b,我们有double

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73342779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档