gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 15:25:07 25 4
gpt4 key购买 nike

我在使用 static_cast 在 constexpr 上下文中向上转换成员指针时遇到了 g++ 问题。请参见代码示例。

在使用 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);

编译器输出

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)){}
^~~~~~~~~~~~~~~~~~~~~~~~~~~

最佳答案

GCC 可能误解了 [expr.static.cast]/12 , 这允许你的类型转换和笔记

If class B contains the original member, or is a base or derived class of the class containing the original member, the resulting pointer to member points to the original member. Otherwise, the behavior is undefined.

因为 Base 确实是包含成员的类的基类,所以应该定义行为,并且构造函数调用常量表达式。

关于c++ - g++ 上 constexpr 上下文中成员指针的 static_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46818864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com