Подтвердить что ты не робот

Почему "явный" не совместим с "виртуальным"?

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())
    {}
}

Мой компилятор - это VС++ 2013 RC.

Почему explicit несовместим с virtual?

Какое обоснование?

4b9b3361

Ответ 1

Похож на ошибку, так как следующие цитаты доказывают, что они действительно совместимы, и я не мог найти ничего, чтобы запретить это.

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.