struct root
{
int i = 0;
};
struct base: root{};
struct derive: base{};
constexpr derive d0;
int main()
{
constexpr auto& r = static_cast<root const&>(d0);
constexpr auto& b = static_cast<base const&>(r);
constexpr auto& d = static_cast<derive const&>(r);
static_assert(d0.i == 0, ""); // ok
static_assert(r.i == 0, ""); // ok
static_assert(b.i == 0, ""); // error in gcc
static_assert(d.i == 0, ""); // ok
}
Clang chấp nhận các mã trên nhưng 7.2.0 gcc biên dịch với lỗi dưới đây:Có phải constexpr đang truy cập thành viên cấp cơ sở từ tham chiếu lớp dẫn xuất trung gian không?
prog.cc:17:5: error: non-constant condition for static assertion
static_assert(b.i == 0, "");
^~~~~~~~~~~~~
prog.cc:17:5: error: accessing value of 'd.derive::<anonymous>.base::<anonymous>' through a 'const base'
glvalue in a constant
Nó không phải là constexpr chỉ khi tôi truy cập giá trị 'i' qua cơ sở trung gian. Trình biên dịch nào là chính xác?
Bạn đang biên soạn đặc tả C++ nào? C++ 17? – dlasalle
được biên dịch với cả C++ 14 và C++ 17 cũng có cùng kết quả. – kwanti
Trường hợp sử dụng thú vị. Tôi chỉ muốn kêu vang trong đó tôi nghĩ rằng nó có lẽ nên được cho phép bởi gcc, nhưng có lẽ họ không cho phép nó bởi vì nó không được đảm bảo an toàn. (chỉ 'dynamic_cast' cho downcasting là) – AndyG