以下代码产生内部编译器错误(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();
}
它将被编译。 当这些方法具有相同的名称时就会出现问题,我需要调用基类方法。 (例如,当使用递归模板继承时)
有什么解决方法吗?
最佳答案
实际问题是 b
被声明为 const
(constexpr
暗示对象上的 const
)而你是尝试调用非 const
(自 C++14 起,constexpr
并不意味着方法上的 const
,参见 here)方法const
对象...
根据标准,您应该无法通过简单地删除 A::
或 static_cast
来解决问题。 Visual Studio 2015 的预 RTM 版本允许您执行此操作,只是因为它对 constexpr
的支持是初步的并且非常有问题。 C++11 constexpr
(但不幸的是不是 C++14 扩展 constexpr
)预计将在 VS 2015 的 RTM 版本中得到完全支持(参见 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;
}
关于c++11 - 调用基类constexpr方法时VS2015内部编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30139718/