std::vector 上的 constexpr 说明符不起作用

问题描述 投票:0回答:1

Edit:这现在在带有非空初始化的 godbolt(gccmsvc)上出错。有一些混乱,因为当 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*>

c++ visual-studio visual-c++ c++20 constexpr
1个回答
2
投票

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
在这个函数的运行时版本

© www.soinside.com 2019 - 2024. All rights reserved.