Edit:这现在在带有非空初始化的 godbolt(gcc,msvc)上出错。有一些混乱,因为当 Godbolt 不是时,我的 msvc 出现空初始化错误(可能是因为我的 msvc 是更新的)。
#include <vector>
constexpr std::size_t f() {
constexpr std::vector<int> v{ 1 };
return 1;
}
int main() {
constexpr auto a = f();
}
与
/std:c++latest
ConsoleApplication9.cpp(12,24): error C2131: expression did not evaluate to a constant ConsoleApplication9.cpp(12,24):消息:(子)对象指向在不断评估期间分配的堆内存
Edit: gcc warning with non-empty initialization 解释了问题
error: 'std::vector(std::initializer_list{((const int*)(& const int [1]{1})), 1}, std::allocator())' 不是常量表达式,因为它指的是“operator new”的结果 195 |返回 static_cast(::operator new(__n)); | ~~~~~~~~~~~~~~~^~~~~<_Tp*>
std::vector
不应该有
constexpr
说明符https://stackoverflow.com/a/69498591/11998382。以下作品
constexpr std::size_t f() {
std::vector<int> aaa{};
return 1;
}
我认为 godbolt 编译这个是错误的。(如果你从不分配那么它没关系)constexpr
函数可以在运行时评估,但是
std::vector
不能是
constexpr
在这个函数的运行时版本