在不带参数的构造函数中使用explicit
关键字有什么原因吗?它会产生任何影响吗?我想知道这个问题,因为我刚刚遇到了这行代码。
explicit char_separator()
在文档 boost::char_separator
的页面接近末尾处有提到,但是那里没有进一步的解释。
在不带参数的构造函数中使用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类型的对象。
What does the explicit keyword mean in C++? 很好地解释了 explicit 关键字。explicit
关键字是噪音,会被忽略。
编辑内容
从 c++ 标准中可得知:12.3.1 第2段指出:explicit 指示符仅在类声明中的构造函数声明中使用;请参见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
关键字,代码将编译通过)。 - Etienne Dechampsexplicit
影响某些初始化能否被执行。 - smiling_nameless是的,它确实有影响。
比较:
struct A
{
A() {}
};
void foo(A) {}
int main()
{
foo({}); // ok
}
并且:
struct A
{
explicit A() {}
};
void foo(A) {}
int main()
{
foo({}); // error
}
explicit
关键字的一个非常特定的角落情况。 - Fred Foo<boost/token_functions.hpp>
,它在那里。 - Fred Foochar_separator
,那么它是一个构造函数,这个问题就是重复的。 - BЈовић