为什么'明确'关键字允许隐式转换?

时间:2015-02-10 03:22:01

标签: c++

class Test {

    private:
    int value;

    public:
    void display(void)
    {
        cout << "Value [" << value << "]" << endl;
    }
    explicit Test(int i)
    {
        value=i;
    }   
};

int main() {

    Test a(5);
    Test b(4.9);

    a.display();
    b.display();

    cin.get();
    return 0;
}

即使提到了显式,浮点值也会转换为int。

我期待(错误地)浮点数不会转换为整数而对象b不会被构造。

2 个答案:

答案 0 :(得分:7)

explicit不会阻止构造函数参数的隐式转换。这意味着构造函数本身可能不会被用作对类类型Test的隐式转换。

void func( Test );  // function declaration

func( 5 ); // Your "explicit" makes this call an error.

要防止构造函数(或任何函数)的参数隐式转换,您可以使用C ++ 11 = delete语法。

  Test(int i)
  {
      value=i;
  }   

  template<typename T>
  Test(const T&) = delete;
  // ^ Aside from your int constructor and the implicitly-generated 
  // copy constructor, this will be a better match for any other type

答案 1 :(得分:3)

explicit只是阻止任何隐式转换。所以如果你有:

void foo(Test t);

您无法致电foo(4);,因为Test构造函数为explicit。你必须致电foo(Test(4));explicit关键字与构建期间可能发生的任何转化无关。

来自标准[class.conv.ctor]:

  

显式构造函数构造对象就像非显式构造函数一样,但是   直接初始化语法(8.5)或强制转换(5.2.9,5.4)显式使用。

这意味着Test t = 4;也是非法的,但Test t(42.0)没问题。