作为学习练习,我一直在研究 C++ 中的自动类型转换是如何工作的。我知道通常应该避免自动类型转换,但我想通过了解它的工作原理来增加我对 C++ 的了解。
我创建了一个StdStringConverter
可以自动转换为 a 的类std::string
,但是当对象与真实对象进行比较时,编译器(Debian 上的 g++ 4.3.4)似乎没有进行转换std::string
(请忽略缺少传递引用和不必要的临时对象创建):
#include <string>
class StdStringConverter
{
public:
explicit StdStringConverter(std::string name) : m_name(name) {}
operator const std::string () const { return m_name; }
private:
std::string m_name;
};
int main()
{
StdStringConverter converter(std::string("Me"));
const std::string name = "Me";
// Next line causes compiler error:
// no match for 'operator==' in 'converter == name'
return (converter == name) ? 0 : 1;
}
另一方面,如果我将其稍微更改为一个CStringConverter
类,则确实会发生自动转换,尽管比较char
指针可能不是我想要的:
#include <string>
class CStringConverter
{
public:
explicit CStringConverter(std::string name) : m_name(name) {}
operator const char* () const { return m_name.c_str(); }
private:
std::string m_name;
};
int main()
{
CStringConverter converter(std::string("Me"));
const char* name = "Me";
// Next line compiles fine, but they are not equal because the
// pointers don't match.
return (converter == name) ? 0 : 1;
}
std::string
在这种情况下, a和 a之间的区别是否有什么特别之处char*
,使得编译器不会将它们视为相同?