explicit でキャスト演算子の暗黙の型変換を抑制する

C++ ではキャスト演算子(operator T)を使用することで型から型へ暗黙の型変換を行うことが出来ます。

struct X{
    constexpr operator int() const{
        return value;
    }
    
    int value;
};

constexpr X x{42};

static_assert(x == 42, "");
constexpr int n = x;


この時に C++11 では explicit を付けることで暗黙の型変換を行えないようにすることが出来ます。

[ソース]

struct X{
    constexpr explicit operator int() const{
        return value;
    }

    int value;
};

int
main(){
    constexpr X x{42};

    // 暗黙の型変換は行えない。
//  constexpr int n = x;
//  static_assert(x == 42, "");

    // 明示的な型変換は行える
    static_assert(static_cast<int>(x) == 42, "");
    constexpr int n = static_cast<int>(x);
    static_assert(n == 42, "");
    return 0;
}


C++03 では手が届かなかったところですね。