【发布时间】:2021-10-17 13:05:10
【问题描述】:
从 C++20 开始,我们可以在编译期间分配内存,而我们必须在编译期间释放它。因此,这对我提出了一些问题: 首先为什么这样做?
constexpr int* return_ptr() {
return new int{ 1 };
}
void call_return_ptr(){
int* int_ptr = return_ptr();
}
int main() {
call_return_ptr();
return 0;
}
我正在使用从constexpr 返回的 ptr,没有 在编译期间释放它。根据我的理解,这应该是一个错误。
其次,如果第一个示例有效,那么为什么这不起作用:
constexpr int* return_ptr() {
return new int{ 1 };
}
void call_return_ptr(){
constexpr int* int_ptr = return_ptr();
}
int main() {
call_return_ptr();
return 0;
}
即使我们在编译时尝试像这样删除指针:
constexpr int* return_ptr() {
return new int{ 1 };
}
constexpr void call_return_ptr(){
constexpr int* int_ptr = return_ptr();
delete int_ptr;
}
int main() {
call_return_ptr();
return 0;
}
这仍然是一个错误。这是怎么回事?
---编辑
Nicol Bolas 对我的问题的第一部分和第二部分给出了非常好的和深刻的答案,但这仍然是为什么第三个版本(call_return_ptr 也是 constexpr 的那个)不起作用的原因。根据 Nicol Bolas 回答的 cmets 上的内容,我仍然不清楚,为什么即使我们将第三版的函数签名更改为 consteval 仍然会出现错误,因为 call_return_ptr 中的所有内容都应该在 constexpr 上下文中.
【问题讨论】:
-
constexpr函数既可以在编译时调用,也可以在运行时调用,因此第一个示例有效的事实并不意味着第二个示例应该有效。