【发布时间】:2014-11-29 19:17:06
【问题描述】:
在 c++11 中,constexpr 表达式不能包含重新解释转换。例如,如果想操作浮点数中的位,比如说找到数字的尾数:
constexpr unsigned int mantissa(float x) {
return ((*(unsigned int*)&x << 9) >> 9);
};
上面的代码不能是constexpr。理论上,我看不出在这种或类似情况下的重新解释与算术运算符有何不同,但编译器(和标准)不允许这样做。
有什么巧妙的方法可以绕过这个限制吗?
【问题讨论】:
-
在非 constexpr 上下文中也不允许这样做。它只是简单的未定义。但是可以使它有效,但这仍然不足以使它成为 constexpr-valid,所以这个问题仍然有效。
-
为什么要在
constexpr中执行此操作,constexpr是滥用的新功能吗? -
@DavidRodríguez-dribeas - 确实如此。我正在尝试探索一些 c++11 功能的边界,这并不是必需的。
-
@hvd - 为什么代码未定义?它可能不是便携式的,但它确实有效:ideone.com/Kh74Ub
-
@nbubis 违反了严格的别名。
标签: c++ c++11 constexpr reinterpret-cast