【问题标题】:'explicit' keyword in g++ has no effect for simple constructor (not copy/assignment constructor)? [duplicate]g ++中的'explicit'关键字对简单构造函数(不是复制/赋值构造函数)没有影响? [复制]
【发布时间】:2016-03-11 19:46:27
【问题描述】:

谁能解释为什么下面的代码可以编译?我希望它会在double 常量3.3 无法转换为int 时出现错误,因为我将构造函数声明为explicit

class A
{
public:
    int n;
    explicit A(int _n);
};

A::A(int _n)
{
    n = _n;
}

int main()
{
    A a(3.3); // <== I expect this line to get an error.
    return 0;
}

【问题讨论】:

  • 我想你可能误解了explicit 关键字的作用。
  • 不,这行会给你错误A b = 24;
  • 这就是统一(即大括号括起来)初始化的用途:A a{3.3}; 会失败,因为它是缩小转换(双精度到整数)。但是A a(3.3); 不允许,因为允许缩小转换。

标签: c++ g++


【解决方案1】:

反之亦然。除了你的代码,让我们定义

void f(A a)
{
}

int main()
{
    A a(3.3); // <== I expect this line to get an error.
    f(5);
    return 0;
}

没有explicit这个词会编译,有explicit会报错。在这种情况下,关键字禁止从整数转换为 A

【讨论】:

    【解决方案2】:

    显式类名(参数)(1)
    显式运算符类型 ( ) (C++11 起) (2)

    1) 指定此构造函数仅考虑用于直接初始化(包括显式转换)

    2) 指定此用户定义的转换函数仅考虑用于直接初始化(包括显式转换)

    在您的情况下,您正在通过这样做使用直接初始化来构造A 类型的实例:

    A a(3.3);
    

    explicit 关键字不会阻止编译器将参数从 double 类型隐式转换为 int。它会阻止你做这样的事情:

    A a = 33;
    

    【讨论】:

      猜你喜欢
      • 2013-06-18
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-10
      • 2016-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多