常量求值时未创建隐式生存期嵌套类型:是Clang的Bug吗?
关于constexpr std::array隐式生存期的编译器分歧问题
这是两个Stack Overflow问题的后续,核心目标是探索如何创建非默认构造类型的constexpr数组。第一个问题的解决方案是使用constexpr版本的std::allocator::allocate;第二个问题延伸到该函数分配对象数组的场景,我原本判断:当通过std::allocator分配std::array的存储后,作为隐式生存期类型的std::array对象会被隐式创建,其内部的数组子对象也会随之隐式创建。
但实际测试中Clang拒绝编译相关代码,我将问题简化为以下最小可复现示例:
#include <array> #include <cstddef> #include <iostream> #include <memory> template <typename T, std::size_t N> constexpr T test() { std::allocator<std::array<T, N>> allocator{}; auto* ptr = allocator.allocate(1); ptr->data()[3] = T{42}; // clang 报错位置 auto ret = ptr->data()[3]; allocator.deallocate(ptr,1); return ret; } int main() { constexpr std::size_t N = 50000; [[maybe_unused]] constexpr auto val = test<int, N>(); }
GCC和MSVC均可正常编译这段代码,但Clang在常量求值阶段报错,提示:
note: member call on object outside its lifetime is not allowed in a constant expression
10 | ptr->data()[3] = T{42};
请问这是Clang的Bug,还是我关于std::array已被隐式创建的判断错误?
内容的提问来源于stack exchange,提问作者Oersted
相关产品推荐
相关产品推荐

