gpt4 book ai didi

c++ - 模板化函数名称查找难题(ADL)

转载 作者:搜寻专家 更新时间:2023-10-31 01:11:46 26 4
gpt4 key购买 nike

给定以下代码,为什么调用通用函数而不是更具体的基于 SomeClass 的函数?

template <typename T>
class SomeClass
{
};

template <typename T>
void foo(T)
{
std::cout << "foo() Generic - Undesired function\n";
}

template <typename T>
void foo(const SomeClass<T>*)
{
std::cout << "foo() SomeClass<T> - Desired function\n";
}


int main()
{
SomeClass<char>* sc = new SomeClass<char>();
foo(sc);
return 0;
}

注意:如果我要从“void foo(const SomeClass<T>*)”定义中删除常量,则会调用所需的函数。我也尝试过重新排列 foo,但它没有任何影响。如果可能,请引用标准中描述此特定 ADL 场景的相关区域。

常量:http://ideone.com/DIchLl

没有常量:http://ideone.com/Iam4LV

使用 const(第 1 个):http://ideone.com/W6PoJw

最佳答案

因为没有 const 的那个需要更少的转换。当编译器选择重载时,它首先寻找完全匹配的重载,然后按特定顺序进行一系列转换,第一个找到的就是使用的。

在这个例子中,scSomeClass<char>*& .编译器首先尝试完全匹配,因为没有,它会尝试删除 & .因为它找到了一个,所以它停止寻找,并且不添加 const这将允许它看到另一个。

关于c++ - 模板化函数名称查找难题(ADL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14431815/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com