可能重复:
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关键字的默认构造函数与没有此关键字的默认构造函数相同.
是的,它确实有效果。
比较:
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)