小编jo-*_*art的帖子

g ++上constexpr上下文中的成员指针的static_cast

我遇到了一个g ++的问题,使用static_cast在constexpr上下文中向上转换成员指针.请参阅代码示例.

在使用g ++版本6.3和7.0进行编译时,它们会出现编译错误,指出reinterpret_cast不是常量表达式.虽然clang 4.0版没有错误,但我认为这是正确的,因为这里没有reinterpret_cast.

这是g ++或clang中的错误吗?什么是正确的行为?

struct Base {};

struct Derived : Base
{
  int i;
};

struct Ptr
{
  constexpr Ptr(int Derived::* p) : p(static_cast<int Base::*>(p)){}
  int Base::* p;
};

constexpr Ptr constexpr_ptr(&Derived::i);
Run Code Online (Sandbox Code Playgroud)

编译器输出

g++ -c -std=c++14 test.cpp 
test.cpp:17:40:   in constexpr expansion of ‘Ptr(&Derived::i)’
test.cpp:11:41: error: a reinterpret_cast is not a constant expression
constexpr Ptr(int Derived::* p) : p(static_cast<int Base::*>(p)){}
                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

c++ constexpr c++11

11
推荐指数
1
解决办法
475
查看次数

标签 统计

c++ ×1

c++11 ×1

constexpr ×1