为什么转换函数不适用于 std::string?

Why doesn't a conversion function work with std::string?

本文关键字:string std 适用于 转换 函数 不适用 为什么      更新时间:2023-10-16

考虑以下类,该类包含std::string类型的转换函数:

class SomeType
{
    public:
    SomeType(char *value)
    {
        _str = value;
    }
    operator std::string()
    {
        return std::string(_str);
    }
    private:
    char *_str;
};

以下代码段编译失败,出现错误:没有运算符"=="匹配这些操作数

int main(int argc, char* argv[])
{
    SomeType a("test");
    if (a == std::string("test")) // ERROR on this line
    {
        int debug = 1;
    }
    return 0;
}

我意识到我可以定义一个接受std::字符串操作数的运算符==方法,但为什么转换函数不起作用呢?

问题是std::string实际上是一个模板,因此我认为它的比较运算符也是一个模板。在这种情况下,我记得的标准规定,所需参数不会发生隐式转换,这意味着你必须强制转换SomeType来字符串,才能调用它。

如有效C++第46项所述:

[…],因为在模板参数推导过程中从不考虑隐式类型转换。从不这样的转换是在函数调用过程中使用的,是的,但在调用函数之前,您必须知道存在哪些函数。[…]

你可以在这里找到更多信息。

std::string实际上是std::basic_string<char, i_do_not_remember> 的typedef

没有operator ==只得到std::string它是一个模板

template<...>
bool operator (basic_string<...>& a, basic_string<...>& b) {
    //
}

但是这里不能推导出模板类型。你可以手动铸造:

if (static_cast<std::string>(a) == std::string("test"))