`operator string()` 类型转换函数的奇怪行为

Cyb*_*lin 4 c++ type-conversion implicit-conversion

我有一个C类,我想string使用operator string()语法将其转换为,但正如我在评论中所写,发生了一些奇怪的事情。

class C {
public:
    operator string()
    {
        return string("anything");
    }
};
int main()
{
    C c;
    cout << string("test:").append(c) << endl; //success
    //cout << string("test:")+c<< endl;//fail
    //cout << c.append("test:") << endl;//fail
    cout << string("test:") + static_cast<string>(c) << endl;//success
}
Run Code Online (Sandbox Code Playgroud)

son*_*yao 8

//cout << string("test:")+c<< endl;//fail
Run Code Online (Sandbox Code Playgroud)

std::operator+(std::basic_string)是模板。模板参数推导中不会考虑隐式转换,这会导致第二个操作数推导失败c

类型推导不考虑隐式转换(除了上面列出的类型调整之外):这是重载解析的工作,稍后发生。

//cout << c.append("test:") << endl;//fail
Run Code Online (Sandbox Code Playgroud)

C没有名为 的成员函数append,则代码失败。您可以显式转换cstd::string,然后append像 那样调用它static_cast<string>(c).append("test:")

cout << string("test:").append(c) << endl; //success
Run Code Online (Sandbox Code Playgroud)

string("test:").append需要一个std::string,然后隐式c转换为std::string并传递给append。(请注意,这些append都是非模板成员函数。)

cout << string("test:") + static_cast<string>(c) << endl;//success
Run Code Online (Sandbox Code Playgroud)

c显式转换为std::string,然后将两个std::strings 传递给std::operator+(std::basic_string).