【问题标题】:Why is `explicit` not compatible with `virtual`?为什么`explicit`与`virtual`不兼容?
【发布时间】:2013-10-21 18:46:31
【问题描述】:
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 不兼容?

原因是什么?

【问题讨论】:

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


【解决方案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。

【讨论】:

  • 这个错误的原因可能是 pre-11 explicit 只能与构造函数一起使用,它不能(或不应该?)是虚拟的,所以他们制定了禁止 @ 的附加规则987654326@ 和 explicit 立即放在一起,而在 VC 2013 中引入 explicit 运算符时,此规则并未更新。
  • 是的 但是为什么我不能在基类中创建一个虚拟构造器,然后在实际类中实现它。
猜你喜欢
  • 2017-10-08
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
  • 2020-06-15
  • 2021-05-06
  • 2021-04-04
  • 2012-10-14
  • 2017-10-11
相关资源
最近更新 更多