【问题标题】:Does "explicit" keyword have any effect on a default constructor?“显式”关键字对默认构造函数有任何影响吗? [复制]
【发布时间】:2011-10-10 03:50:21
【问题描述】:

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

explicit char_separator()

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

【问题讨论】:

  • 不是骗子;这个问题是关于 explicit 关键字的一个非常具体的极端情况。
  • 那不是函数,那是构造函数 - 见stackoverflow.com/questions/121162/…
  • @larsmans 很难说没有看到一些真实的例子
  • @VJo:检查<boost/token_functions.hpp>,它就在那里。
  • @larsman 如果我们在上面的链接(boost.org/doc/libs/1_47_0/libs/tokenizer/char_separator.htm)中描述的char_separator,那么它是一个构造函数,这个问题是重复的。

标签: c++ default-constructor explicit


【解决方案1】:

阅读explanation of members

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 关键字是噪音,被忽略了。

编辑

来自 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

——结束示例]

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

【讨论】:

  • "第二个构造函数的显式关键字是噪音,被忽略。"什么?
  • 这个答案是错误的,至少在考虑现代版本的 C++ 中的大括号初始化时是错误的。证明:godbolt.org/z/zdNvTp(如果删除了explicit关键字,则代码编译)。
  • explicit 影响是否可以执行某些初始化。
猜你喜欢
  • 2016-03-11
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
  • 2020-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多