学習演習として、C++で自動型変換がどのように機能するかを調べてきました。自動型変換は一般的に避けるべきだと知っていますが、とにかくそれがどのように機能するかを理解することによって、C++の知識を増やしたいと思います。
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;
}
このコンテキストでのastd::string
とaの違いについて、コンパイラがそれらを同じように扱わないようにする特別な何かがありますか?char*