【问题标题】:VS2015 internal compiler error when calling base class constexpr method调用基类 constexpr 方法时 VS2015 内部编译器错误
【发布时间】:2015-07-20 07:22:50
【问题描述】:

以下代码产生内部编译器错误 (VS2015)

struct A
{
    constexpr A(){}
    constexpr int bar()
    {
        return 3;
    }
};

struct B : A
{
    constexpr B(){}
    constexpr int foo()
    {
        return A::bar();
    }
};

int main()
{
    constexpr B b;
    constexpr int dummy = b.foo();
    return 1;
}

但是,如果我要删除 A:: 限定符:

constexpr int foo()
{
    return bar();
}

它将被编译。 当这些方法具有相同的名称时会出现问题,我需要调用基类方法。 (例如,使用递归模板继承时)

有什么解决方法吗?

【问题讨论】:

  • this->A::bar(); 怎么样?
  • @DanielFrey 一样
  • 你提交过错误吗?

标签: c++11 c++14 constexpr visual-studio-2015


【解决方案1】:

实际的问题是b 被声明为constconstexpr 暗示const 在对象上)并且您试图调用非const(因为C++14,constexpr 没有' t 暗示 const 在方法上,参见 here) 方法和 const 对象...

根据标准,您应该无法通过简单地删除A::static_cast 来解决问题。 Visual Studio 2015 的 RTM 前版本允许您这样做,只是因为它对 constexpr 的支持是初步的并且有很多错误。预计将在 VS 2015 的 RTM 版本中完全支持 C++11 constexpr(但不幸的是不是 C++14 扩展 constexpr)(请参阅 here)。

您的代码的正确版本是:

struct A
{
    constexpr A(){}
    constexpr int bar() const
    {
        return 3;
    }
};

struct B : A
{
    constexpr B(){}
    constexpr int foo() const
    {
        return A::bar();
    }
};

int main()
{
    constexpr B b;
    constexpr int dummy = b.foo();
    return 1;
}

【讨论】:

    【解决方案2】:

    找到了解决办法。 "this" 应该转换为 const A*:

    struct B : A
    {
        constexpr B(){}
        constexpr int foo()
        {
            return static_cast<const A*>(this)->bar();
        }
    };
    

    当方法名称相同时也可以使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-06
      • 2020-05-21
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 2014-12-06
      • 1970-01-01
      相关资源
      最近更新 更多