【发布时间】:2019-04-25 07:47:57
【问题描述】:
GCC 8.2.1 和 MSVC 19.20 编译以下代码,但 Clang 8.0.0 和 ICC 19.0.1 无法编译。
// Base class.
struct Base {};
// Data class.
struct Data { int foo; };
// Derived class.
struct Derived : Base, Data { int bar; };
// Main function.
int main()
{
constexpr int Data::* data_p{ &Data::foo };
constexpr int Derived::* derived_p{ data_p };
constexpr int Base::* base_p{ static_cast<int Base::*>(derived_p) };
return (base_p == nullptr);
}
Clang 8.0.0 的错误信息如下:
case.cpp:16:33: error: constexpr variable 'base_p' must be initialized by a constant expression
constexpr int Base::* base_p{ static_cast<int Base::*>(derived_p) };
~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我注意到它在两种情况下都可以用 Clang 编译:
- 从最后一个定义中删除 constexpr
- 将
constexpr int Derived::* derived_p{ data_p };行替换为constexpr int Derived::* derived_p{ &Derived::bar };。
constexpr 表达式(使 Clang 和 ICC 失败的那个)应该编译吗?
【问题讨论】:
-
感谢您的回答,我已经填写了错误报告here
标签: c++ language-lawyer constexpr pointer-to-member