显式

  1. 应用于单参数构造函数时,阻止使用该构造函数执行隐式转换。

    class MyVector {
      public:
        explicit MyVector(uint64_t size);
    };
    MyVector v1(100);  // ok
    uint64_t len1 = 100;
    MyVector v2{len1}; // ok, len1 is uint64_t
    int len2 = 100;
    MyVector v3{len2}; // ill-formed, implicit conversion from int to uint64_t
    

    由于 C++ 11 引入了初始化列表,在 C++ 11 及更高版本中,explicit 可以应用于具有任意数量参数的构造函数,其含义与单参数情况相同。

    struct S {
        explicit S(int x, int y);
    };
    S f() {
        return {12, 34};  // ill-formed
        return S{12, 34}; // ok
    }
    

Version >= C++ 11

  1. 应用于转换函数时,会阻止使用该转换函数执行隐式转换。

    class C {
        const int x;
      public:
        C(int x) : x(x) {}
        explicit operator int() { return x; }
    };
    C c(42);
    int x = c;                   // ill-formed
    int y = static_cast<int>(c); // ok; explicit conversion