gpt4 book ai didi

C++ 转换运算符和重载决议

转载 作者:太空狗 更新时间:2023-10-29 21:05:43 25 4
gpt4 key购买 nike

给出这个例子,其中包括一些重载:

#include <iostream>

class T
{
public:
operator const wchar_t *(void) const
{
std::cout << "Conversion" << std::endl;
return L"Testing";
}
};

template <class Elem>
class A
{
};

template <class T>
void operator <<(A<T> &, const T *)
{
std::cout << "1" << std::endl;
}

template <class T>
void operator <<(A<T> &, const void *)
{
std::cout << "2" << std::endl;
}

int main(void)
{
A<wchar_t> test;
T source;

test << L"1";
test << static_cast<const wchar_t *>(source);
test << source;
}


及其输出:

1
Conversion
1
Conversion
2


我的问题是 - 为什么是 void operator <<(A<T> &, const void *)被要求发表声明test << source; ?任何人都可以引用涵盖这种情况的标准的特定部分吗?

最佳答案

因为模板参数推导不采用用户定义的隐式转换考虑在内。结果是当你写的时候:

test << source;

,编译器无法为第一个函数找到合适的 T模板;它试图找到一个 T 使得 T const* 具有相同的键入您的 T,这是不可能的。参数推导失败,并且没有模板的实例被添加到重载集中。自从第二个参数的第二个参数中没有模板参数函数模板,没有参数推导失败,并且结果实例化成为重载集的唯一成员,并且所以最终被选中。

关于C++ 转换运算符和重载决议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9197635/

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