空指针是否可以"dereferenced"评估为 constexpr?



我有以下代码:

#include <cstddef>
template<typename Base, typename Class>
constexpr std::size_t offsetOf( Base Class::*r )
{
return (size_t)&(((Class *)nullptr)->*r);
}
struct X
{
int a, b;
};
int main()
{
char charsUntilB[offsetOf( &X::b )];
}

clang和g++编译这个没有任何问题,但是MSVC说offsetOf调用不能被求值为常量。根据标准哪个编译器是正确的

某个程序员是对的。只是msvc++不支持vla。如果我有-Werror=vla,我得到一个错误与g++和clang。
似乎没有办法让offsetOf compiletime-evaluateable,无论如何,我可以满足一些程序员的强迫性愿望,不解引用nullptr:

template<typename Base, typename Class>
constexpr std::size_t offsetOf( Base Class::*r )
{
union U
{
U() {}
Class obj;
} u;
return (size_t)&(u.obj.*r) - (size_t)&u.obj;
}

最新更新