C++ 静态与直接调用转换运算符?

C++ 静态与直接调用转换运算符?,c++,casting,static-cast,conversion-operator,C++,Casting,Static Cast,Conversion Operator,考虑以下类,仅作为一个简单的示例: #包括 #包括 使用名称空间std; 类点{ 公众: int_x{0}; int_y{0}; 点(){} 点(intx,inty):x{x},y{y}{ 运算符字符串()常量 {返回'['+to_string(_x)+','+to_string(_y)+']'} friend ostream&operator否您永远不需要直接调用转换运算符成员函数 如果使用类的实例,其中需要std::string对象,则编译器将自动调用转换运算符,如果使用例如static\u

考虑以下类,仅作为一个简单的示例:

#包括
#包括
使用名称空间std;
类点{
公众:
int_x{0};
int_y{0};
点(){}
点(intx,inty):x{x},y{y}{
运算符字符串()常量
{返回'['+to_string(_x)+','+to_string(_y)+']'}

friend ostream&operator否您永远不需要直接调用转换运算符成员函数

如果使用类的实例,其中需要
std::string
对象,则编译器将自动调用转换运算符,如果使用例如
static\u cast
将实例强制转换为
std::string
,则转换运算符也会自动调用

简单而愚蠢的例子:

void print_string(std::string const& s)
{
    std::cout << s << '\n';
}

int main()
{
    point p(1, 2);

    print_string(p);  // Will call the conversion operator
    print_string(static_cast<std::string>(p));  // Will call the conversion operator too
}
void打印字符串(std::string const&s)
{
标准::cout
那么,这些方法之间是否存在实际差异

就我所知,在这种情况下,行为是明智的

(包括可能不适用于本示例的内容)

如果
X
具有类型
Y
的转换构造函数,则静态\u转换(Y的实例)
也将允许转换。显式调用(可能不存在)
Y
的转换运算符无法使用提到的转换构造函数。当然,在这种情况下,
std::string
没有用于
点的转换构造函数


因此,强制转换更为通用,这也是我通常喜欢的。另外,“将此对象转换为类型
字符串
”比“调用操作符
字符串()
”更有意义。但是如果出于某种非常奇怪的原因,您希望避免转换构造函数,那么显式调用转换操作符将实现这一点

“从不”-基于什么?转换构造函数的优点,没想到。