作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下代码可以使用 gcc 和 MSVC 编译,但不能使用 clang。
#include <array>
#include <vector>
consteval void foo(auto func) {
std::array<int, func().size()> f;
}
int main() {
foo([](){ return std::vector<int>{1,2,3,4,5};});
}
如果我明白the rules常量表达式中动态内存分配的正确性,这应该是允许的,因为内存会立即释放。这是 clang 中的错误吗?甚至是未定义的行为?
最佳答案
这只是 Clang 中的一个错误。它似乎没有将表达式末尾发生的释放视为模板参数,作为常量(完整)表达式的一部分。当使用 constexpr
变量而不是模板参数来存储大小时,Clang 也接受它。
一个简化的测试用例(不依赖于 std::vector
constexpr 支持):
struct V {
int* v = new int[10];
constexpr ~V() { delete[] v; }
constexpr int size() { return 10; }
};
template<auto>
struct A {};
int main() {
constexpr auto x = V{}.size(); //1
using T = A<V{}.size()>; //2
}
Clang 接受//1
,但不接受//2
。
快速浏览 https://github.com/llvm/llvm-project/issues我找不到匹配的问题,因此报告它可能有意义。
关于c++ - 编译器不同意在 constexpr 上下文中使用 std::vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73748978/
我是一名优秀的程序员,十分优秀!