作为一项学习练习,我一直在研究C++中的自动类型转换。我知道自动类型转换通常应该避免,但我想通过了解它的工作原理来增加我的C++知识。
我创建了一个StdStringConverter类,可以自动转换为std::string,但编译器(Debian上的g++ 4.3.4)似乎在将对象与实际的std::string进行比较时没有进行转换(请忽略无需传递引用和不必要创建临时对象的情况):
在这种情况下,
我创建了一个StdStringConverter类,可以自动转换为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
和char*
之间的区别是否有特殊性质使编译器不能将它们视为相同的?