"explicit"关键字对默认构造函数有任何影响吗?
Does "explicit" keyword have any effect on a default constructor?
对于不接受任何参数的构造函数,是否有理由使用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
}
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何在不产生任何垃圾的情况下获得C中的像素
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 是否有任何区域设置会影响宽字符编码?
- 为什么 std::move 对 std::unique_lock 没有任何影响?
- 当在循环中使用时,std::shared_ptr 对该循环的矢量化有任何影响吗?
- 这会对代码产生任何影响吗?
- 与任何算术操作员都会影响优化的恒定操作数顺序
- C/C++:-msse 和 -msse2 标志对二进制文件没有任何影响
- 注释在运行时是否可以产生任何影响
- 公共和私有对对象的内存布局是否有任何影响
- 对自我的 typedef 是否有任何影响
- 包含每个标头是否有任何性能影响
- 以下任何配置都会影响发布版本的性能吗
- 当调用放置新时,强制投射指向"void*"的指针是否有任何影响?
- 在程序结束后,内存泄漏有任何影响吗?
- "explicit"关键字对默认构造函数有任何影响吗?
- signal():任何性能影响