【发布时间】:2017-06-25 08:29:45
【问题描述】:
我想知道根据 c++11 标准,constexpr offset_of 的这个定义是否正确。
根据this article,C++98 允许在数组声明中进行转换。我调整了文章中的代码以允许我的一些案例。我可以执行以下操作吗?如果没有,有没有更好的方法?
template<typename T>
struct declval_helper { static T value; };
template<typename T, typename Z, typename U, Z U::*MPtr>
struct offset_helper {
using TV = declval_helper<T>;
static char for_sizeof[1 + (
(char *)&(TV::value.*MPtr) -
(char *)&TV::value
)];
};
template<typename T, typename Z, typename U, Z U::*MPtr>
constexpr std::size_t offset_of() {
return sizeof(detail::offset_helper<T, Z, U, MPtr>::for_sizeof) - 1;
}
一个用例:
struct Base { int data; };
struct Derived : Base { float data; };
constexpr std::size_t offset = offset_of<Derived, int, Base, &Base::data>();
【问题讨论】:
-
不,不是。数组绑定必须是一个常量表达式,并且 C 样式转换中隐含的
reinterpret_cast不能是其中的一部分。 -
@Columbo 如果我在 constexpr 函数中移动数组声明,编译器会告诉我它不是常量表达式。但是,当在类中声明时,它在 clang 和 gcc 中都可以正常工作。
-
@Guillaume 你用的是
-pedantic还是-pedantic-errors? -
@cpplearner 你可以自己看看:coliru.stacked-crooked.com/a/754d727287b9c205
-
它甚至可以与明确的重新解释强制转换一起使用:coliru.stacked-crooked.com/a/387ce964e123b62a
标签: c++ c++11 language-lawyer constexpr