13
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。

为什么explicit不兼容virtual

理由是什么?

4

1 回答 1

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。

于 2013-10-14T08:52:00.207 回答