【问题标题】: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();
}
它将被编译。
当这些方法具有相同的名称时会出现问题,我需要调用基类方法。 (例如,使用递归模板继承时)
有什么解决方法吗?
【问题讨论】:
标签:
c++11
c++14
constexpr
visual-studio-2015
【解决方案1】:
实际的问题是b 被声明为const(constexpr 暗示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();
}
};
当方法名称相同时也可以使用。