顯式

  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