编辑:这现在在非空初始化的godbolt(gcc,msvc)上出错。出现了一些混乱,因为我的msvc在godbolt没有初始化的情况下出现了空初始化错误(可能是因为我的ms vc更新)。
#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):错误C2131:表达式未计算为常量ConsoleApplication9.cpp(12,24):消息:(sub-)对象指向在常量评估期间堆分配的内存
编辑:带有非空初始化的gcc警告解释了问题
错误:"std::vector(std::initializer_list{((const int*)(&const int[1]{1})),1},std::allocater()"不是常量表达式,因为它引用了"operator new"的结果195|返回static_cast<_Tp*>(::运算符new(__n));|~~~~~~
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