gpt4 book ai didi

c++ - 为什么隐式转换为 std::string 不适用于调用 operator<<

转载 作者:太空宇宙 更新时间:2023-11-03 10:38:12 26 4
gpt4 key购买 nike

起初,我使用用户定义的转换函数将对象隐式转换为 int然后将其插入 cout<<运算符(operator)。程序编译成功并打印'0'。

#include <iostream>

using namespace std;

class T {
public:
operator int () {
return 0;
}
};

int main()
{
T a;
cout << a << endl;
return 0;
}

然后,我尝试做同样的事情,只是将对象转换为 std::string。 .程序出现编译错误。

#include <iostream>
#include <string>

using namespace std;

class T {
public:
operator string () {
return "";
}
};

int main()
{
T a;
cout << a << endl;
return 0;
}

为什么在第二种情况下不发生隐式转换。

最佳答案

Why implicit conversion doesn't happen on the second case.

因为 operator<<(std::basic_string) 是一个模板函数,

template <class CharT, class Traits, class Allocator>
std::basic_ostream<CharT, Traits>&
operator<<(std::basic_ostream<CharT, Traits>& os,
const std::basic_string<CharT, Traits, Allocator>& str);

这意味着给定T a; cout << a << endl; ,要调用它,需要推导所有三个模板参数。但是在template argument deduction ,不考虑隐式转换,推导失败。

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

另一方面, std::basic_ostream::operator<<(int) 是一个非模板函数;它没有这样的问题。

关于c++ - 为什么隐式转换为 std::string 不适用于调用 operator<<,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54616713/

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