显式
-
应用于单参数构造函数时,阻止使用该构造函数执行隐式转换。
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
-
应用于转换函数时,会阻止使用该转换函数执行隐式转换。
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