为什么`explicit`与`virtual`不兼容?

时间:2013-10-14 08:30:38

标签: c++ function c++11 virtual explicit

struct A
{
    // error C2216: 'explicit' cannot be used with 'virtual'
    virtual explicit operator bool() const 
    {
        return true;
    }
};

struct B : A
{
    // error C2216: 'explicit' cannot be used with 'override'
    explicit operator bool() const override 
    {
        return false;
    }
};

int main()
{
    if (A())
    {}

    if (B())
    {}
}

我的编译器是VC ++ 2013 RC。

为什么explicitvirtual不兼容?

理由是什么?

1 个答案:

答案 0 :(得分:18)

看起来像一个错误,因为以下引用证明它们确实兼容,我找不到任何禁止它。

12.3.2转换函数[class.conv.fct]

  

2)转换功能可以是explicit [...]
  [...]
  5)转换函数可以是virtual

7.1.2函数说明符[dcl.fct.spec]

  

5)virtual说明符只能用于非静态类成员函数的初始声明;   见10.3。
  6)explicit说明符只能用于声明构造函数或转换函数   它的类定义;见12.3.1和12.3.2。