为何Clang允许constexpr中使用该C风格强制类型转换?
为何Clang允许constexpr中的C风格指针转换而GCC不允许?
这段代码可以在Clang++ 14中编译通过,但在G++ 12中编译失败,报错原因是constexpr中不允许使用reinterpret_cast:
constexpr int* convert(char* a) { return (int*)(a); } int main() { return (int) *convert(new char('a')); }
核心原因解析
- C风格的
(int*)(a)本质等价于reinterpret_cast<int*>(a),而C++标准明确规定:constexpr函数中禁止使用reinterpret_cast。 - Clang默认开启了非标准扩展,允许在constexpr中使用这类原本被标准禁止的操作,属于编译器的兼容或实验性特性。
- GCC则严格遵循C++标准的要求,默认不允许此类违反标准的行为,因此直接触发编译错误。
如果需要让GCC编译这段代码,可以添加-fpermissive选项放宽标准检查,但这种做法不推荐,会破坏代码的标准合规性。更合理的方案是修改代码,避免在constexpr函数中进行这类指针类型转换。
内容的提问来源于stack exchange,提问作者pulsejet
相关产品推荐
相关产品推荐

