"explicit"关键字对默认构造函数有任何影响吗?

Does "explicit" keyword have any effect on a default constructor?

本文关键字:任何 影响 构造函数 explicit 关键字 默认      更新时间:2023-10-16

对于不接受任何参数的构造函数,是否有理由使用explicit关键字?它有效果吗?我想知道,因为我刚刚穿过

explicit char_separator()

在记录boost::char_separator的页面末尾,但没有进一步解释。

阅读会员说明:

explicit char_separator(const Char* dropped_delims,
                        const Char* kept_delims = "",
                        empty_token_policy empty_tokens = drop_empty_tokens)
explicit char_separator()

第一个构造函数的explicit关键字要求显式创建char_separator类型的对象。显式关键字在C++中是什么意思?很好地涵盖了显式关键字。

第二个构造函数的explicit关键字是噪声,将被忽略。

编辑

来自c++标准:

7.1.2第6页告诉:

明确的说明符只能用于类声明中的构造函数;见12.3.1。

12.3.1乙方告诉:

显式构造函数像非显式构造函数一样构造对象构造函数,但仅在直接初始化语法的情况下执行(8.5(或明确使用强制型铸件(5.2.9、5.4(的情况下。默认值构造函数可以是显式构造函数;这样的构造函数用于执行默认初始化或值初始化(8.5(。[示例:

class Z {
public:
explicit Z();
explicit Z(int);
// ...
};
Z a;               // OK: default-initialization performed
Z a1 = 1;          // error: no implicit conversion
Z a3 = Z(1);       // OK: direct initialization syntax used
Z a2(1);           // OK: direct initialization syntax used
Z* p = new Z(1);   // OK: direct initialization syntax used
Z a4 = (Z)1;       // OK: explicit cast used
Z a5 = static_cast<Z>(1); // OK: explicit cast used

--结束示例]

因此,带有explicit关键字的默认构造函数与没有此关键字的构造函数相同。

是的,它确实有效果

比较:

struct A
{
    A() {}
};
void foo(A) {}
int main()
{
    foo({}); // ok
}

和:

struct A
{
    explicit A() {}
};
void foo(A) {}
int main()
{
    foo({}); // error
}