3

今日、ユーザー定義の暗黙的な変換演算子で興味深い動作を経験しました。

このコードを見てみましょう:

struct Widget {
    Widget(uint64_t) {

    }

    Widget(const std::string &) {

    }

    operator uint64_t() {
        return static_cast<uint64_t>(123456789UL);
    }

    operator std::string() {
        return std::string("Hello");
    }
};

uint64_t または std::string に暗黙的に変換できる基本構造体。

次に、 std::cout を使用して Widget インスタンスを出力してみます:

#include <iostream>

int main() {
    using std::cout;
    Widget w(123456);

    cout << w;
}

何らかの理由で、ウィジェットは常に uint64_t に変換されます。最初は、呼び出しがあいまいで、 compile への標準の明示的な変換で修飾されると予想します。

int main() {
    using std::cout;
    Widget w(123456);

    cout << static_cast<uint64_t>(w);

}

しかし、私が今無視している理由により、演算子 uint64_t が選択されています。C++ の仕様を調べようとしましたが、私の質問に答えるのに役立つものは見つかりませんでした。

コンパイラがオーバーロードの解決で何をしているのかを理解するのを手伝ってくれる人はいますか?

4

2 に答える 2