【问题标题】:explicit non-single parameter constructor显式非单参数构造函数
【发布时间】:2013-12-13 04:32:45
【问题描述】:

谁能解释为什么非单参数构造函数标记为显式编译? 据我了解,这在这里绝对是无用的关键字,那为什么编译没有错误呢?

class X
{
public:
    explicit X(int a, int b) { /* ... */}
};

【问题讨论】:

  • 作为一项规则,C++ 标准尝试指定尽可能统一的规则,以使语法在组合功能时尽可能地表现得不令人惊讶。所以,我认为反问应该是:有什么理由明确禁止将这样的构造函数标记为explicit
  • 伙计们,你说的是 C++11,我说的是 C++98 或 C++03,当时没有 {} 初始化,没有可变参数模板等等。 .
  • @FrédéricHamidi 我做到了。 OP:如果你对 C++03 的答案感兴趣,你应该明确地说出来。请注意,现在是 2013 年。
  • 如今,C++ 被视为暗示“当今的当前标准”,而 C++11 似乎仅用于 C++11 问题。所以当你问问题的时候指定 C++03 是很值得的,否则大多数人会假设 C++11,即使你没有那个标签。

标签: c++ constructor explicit explicit-constructor


【解决方案1】:

在 C++03 中,在这种特殊情况下,将两个参数的构造函数标记为 explicit 是没有意义的。但这在这里可能有意义:

explicit X(int i, int j=42);

因此,用explicit 标记一个双参数构造函数不一定是错误。

在 C++11 中,这种使用显式会阻止您这样做:

X x = {1,2};

【讨论】:

  • 是的,但是在我的示例中,编译器可以理解没有意义,并且不能用一个参数调用构造函数,因此可能会产生编译时错误。
  • @axe 是的,我同意,也许语言规则对此可能更严格。问题是是否值得为潜在利益增加规则的复杂性。现在,快进到 2011 年和 C++11,explicit 确实 在多参数构造函数中发挥作用。所以有人可能会说,该规则最初没有变得更严格是幸运的。
  • 好的。我想我们可以结束这个问题。谢谢大家。
【解决方案2】:

不完全正确。

在 C++11 中,可以使用大括号初始化隐式转换具有多个参数的构造函数。

【讨论】:

    猜你喜欢
    • 2010-09-15
    • 2011-10-27
    • 1970-01-01
    • 2017-12-31
    • 2016-12-31
    • 2013-06-01
    • 2023-03-17
    • 2013-05-09
    相关资源
    最近更新 更多