Tôi đã gặp một vấn đề với g ++ với upcasting của một con trỏ thành viên trong một bối cảnh constexpr sử dụng static_cast. Xem ví dụ về mã.static_cast của con trỏ thành viên trong ngữ cảnh constexpr trên g ++
Khi biên dịch bằng g ++ phiên bản 6.3 và 7.0, chúng cung cấp lỗi biên dịch cho biết reinterpret_cast không phải là biểu thức liên tục. Trong khi phiên bản 4.0 clang không có lỗi, mà tôi nghĩ là chính xác vì không có reinterpret_cast ở đây.
Đây có phải là lỗi trong g ++ hoặc clang không? Hành vi chính xác là gì?
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);
biên dịch ra
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)){}
^~~~~~~~~~~~~~~~~~~~~~~~~~~
Điều này thực sự không phải là một sự u ám. –