当前位置:  开发笔记 > 编程语言 > 正文

自动类型转换为std :: string和char*之间的C++差异

如何解决《自动类型转换为std::string和char*之间的C++差异》经验,为你挑选了1个好方法。

作为一个学习练习,我一直在研究自动类型转换在C++中的工作原理.我知道通常应该避免自动类型转换,但我想通过了解它的工作原理来增加我对C++的了解.

我已经创建了一个StdStringConverter可以自动转换为a的类std::string,但编译器(Debian上的g ++ 4.3.4)似乎不会在将对象与real进行比较时进行转换std::string(请忽略缺少传递引用和不必要的临时对象创建):

#include 

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 

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;
}

在这个上下文中a std::string和a 之间的区别是否有一些特殊之处char*使编译器不对它们进行相同处理?



1> Leandro T. C..:

问题是由于std :: string实际上是类模板std :: basic_string的一个实例.在命名空间std中可用的operator ==需要两个std :: basic_string模板:

template
bool operator==(const basic_string& lhs,
                const basic_string& rhs);

如果这个版本的operator ==专门在std :: string上重载,那么你的代码就可以了.但事实并非如此,这需要编译器对std :: basic_string的模板参数执行模板参数推断,这样才能理解转换运算符的返回是可能的匹配.

但是,编译器不会这样做.我不知道标准的哪一部分准确说明了这一点.但一般的想法是,此类转换仅适用于非模板类型.

我可以建议的一件事是将StdStringConverter放在命名空间中,并在该命名空间中为std :: string提供operator ==的版本.这样,当您的编译器找到类似ADL(Argument Dependent Lookup)的表达式时,一切正常.

#include 

namespace n1 {

class StdStringConverter
{
public:
    explicit StdStringConverter(std::string name) : m_name(name) {}
    operator std::string () { return m_name; }
private:
    std::string m_name;
};

bool operator==(std::string const& a, std::string const& b)
{
  return a == b; //EDIT: See Paul's comment on std::operator== here.
}

}

int main()
{
    using namespace n1;
    StdStringConverter converter(std::string("Me"));
    std::string name = "Me";
    return (converter == name) ? 0 : 1;   
}

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有