gpt4 book ai didi

c++ - 为什么 operator<< 选择明显错误的重载?

转载 作者:可可西里 更新时间:2023-11-01 17:56:35 25 4
gpt4 key购买 nike

考虑这段代码:

#include <iostream>
using namespace std;

class X {
public:
operator const wchar_t* () const { return L"Hello"; }
};

void f(const void *) {
wcout << L"f(const void*)\n";
}

void f(const wchar_t*) {
wcout << L"f(const wchar_t*)\n";
}

int main() {
X x;
f(x);

wcout << x;
}

输出为(使用 VS2015 C++ 编译器编译):

f(const wchar_t*)
00118B30

所以看起来编译器选择了预期的 const wchar_t* f 过载(因为存在从 Xconst wchar_t* 的隐式转换)。

但是,似乎wcout << x选择 const void*过载,而不是 const wchar_t*一个(打印地址,而不是 wchar_t 字符串)。

这是为什么?

P.S. 我知道正确的打印方式 X是实现 operator<< 的重载喜欢wostream& operator<<(wostream& , const X&) ,但这不是问题的重点。

最佳答案

因为在推导模板参数时不考虑转换函数:

// Non-template member function.
basic_ostream& basic_ostream::operator<<( const void* value );

// Template non-member function.
template< class CharT, class Traits >
basic_ostream<CharT,Traits>& operator<<( basic_ostream<CharT,Traits>& os,
const CharT* s );

第二个声明不考虑转换operator const wchar_t* () const

我找不到标准报价,cppreference Template argument deduction, Implicit conversions说:

Type deduction does not consider implicit conversions (other than type adjustments listed above): that's the job for overload resolution, which happens later.

关于c++ - 为什么 <iostream> operator<< 选择明显错误的重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45378581/

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