gpt4 book ai didi

C++ 自动类型转换为 std::string 和 char* 的区别

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:33:00 24 4
gpt4 key购买 nike

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

我已经创建了一个可以自动转换为 std::stringStdStringConverter 类,但是编译器(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::stringchar* 之间的区别是否有什么特殊之处使得编译器不会对它们一视同仁?

最佳答案

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


template<class charT, class traits, class Allocator>
bool operator==(const basic_string& lhs,
const basic_string& rhs);

如果此版本的 operator== 专门在 std::string 上重载,您的代码就没问题。但事实并非如此,这将要求编译器对 std::basic_string 的模板参数执行模板参数推导,以便它可以理解转换运算符的返回是可能的匹配。

但是,编译器不会那样做。我不知道标准的哪一部分准确说明了这一点。但总体思路是此类转换仅适用于非模板类型。

我可以建议您将 StdStringConverter 放在命名空间中,并为该命名空间中的 std::string 提供一个 operator== 版本。这样,当您的编译器找到类似 ADL(参数相关查找)的表达式时,一切正常。


#include <string>

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

关于C++ 自动类型转换为 std::string 和 char* 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1443870/

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