没有参数的函数的c ++显式关键字

Kil*_*del 28 c++ explicit

可能重复:
C++中的explicit关键字是什么意思?

是否有理由将explicit关键字用于不带任何参数的函数?它有什么影响吗?我想知道因为我刚刚遇到了这条线

explicit char_separator()

在页面末尾附近记录了boost :: char_separator(http://www.boost.org/doc/libs/1_47_0/libs/tokenizer/char_separator.htm),但在那里没有进一步解释.

BЈо*_*вић 18

阅读会员说明:

explicit char_separator(const Char* dropped_delims,
                        const Char* kept_delims = "",
                        empty_token_policy empty_tokens = drop_empty_tokens)
explicit char_separator()
Run Code Online (Sandbox Code Playgroud)

explicit一个构造函数的关键字需要显式创建char_separator类型的对象. 显式关键字在C++中的含义是什么?很好地涵盖了显式关键字.

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

编辑

从c ++标准:

7.1.2 p6告诉:

显式说明符只能用于类声明中构造函数的声明; 见12.3.1.

12.3.1 p2告诉:

显式构造函数与非显式构造函数一样构造对象,但仅在显式使用直接初始化语法(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
Run Code Online (Sandbox Code Playgroud)

- 末端的例子]

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

  • 这个答案是错误的,至少在考虑现代 C++ 版本中的大括号初始化时是这样。证明:https://godbolt.org/z/zdNvTp(如果删除“explicit”关键字,则代码可以编译)。 (4认同)

Hol*_*Cat 8

是的,它确实有效果。

比较:

struct A
{
    A() {}
};

void foo(A) {}

int main()
{
    foo({}); // ok
}
Run Code Online (Sandbox Code Playgroud)

和:

struct A
{
    explicit A() {}
};

void foo(A) {}

int main()
{
    foo({}); // error
}
Run Code Online (Sandbox Code Playgroud)