static_cast与直接调用转换运算符?

ada*_*603 4 c++ casting static-cast conversion-operator

考虑以下类,就像一个简单的例子:

#include <iostream>
#include <string>
using namespace std;

class point {
public:
    int _x{ 0 };
    int _y{ 0 };

    point() {}
    point(int x, int y) : _x{ x }, _y{ y } {}
    operator string() const
        { return '[' + to_string(_x) + ',' + to_string(_y) + ']'; }

    friend ostream& operator<<(ostream& os, const point& p) {

        // Which one? Why?
        os << static_cast<string>(p); // Option 1
        os << p.operator string();    // Option 2

        return os;
    }
};
Run Code Online (Sandbox Code Playgroud)

是否应该直接调用转换运算符,或者只是调用static_cast并让它完成工作?

这两行几乎完全相同(就是调用转换运算符),就我所知,它们的行为没有真正的区别.所以这里真正的问题是这是否真实.虽然这对我来说似乎是一样的,但仍然可能存在一些人们可能无法接受的微妙差异.

那些方法之间是否有任何实际差异(包括可能不适用于此示例的方法),除了它们的语法不同的事实?应该首选哪一个?为什么?

eer*_*ika 5

那些方法之间是否有任何实际差异

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

(包括可能不适用于此示例的那些)

static_cast<X>(instance_of_Y)如果X有类型的转换构造函数,也会允许转换Y.对(可能不存在的)转换运算符的显式调用Y无法使用上述转换构造函数.在这种情况下,当然std::string没有转换构造函数point.

因此,演员表更通用,这是我一般喜欢的.另外"转换这个对象类型string"是不是更有意义"呼叫接线员string()".但是如果出于一些非常奇怪的原因你想避免使用转换构造函数,那么显式调用转换运算符就可以实现这一点.