从 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;
}
Run Code Online (Sandbox Code Playgroud)
我正在使用从编译时返回的 ptrconstexpr并且没有释放它。根据我的理解,这应该是一个错误。其次,如果第一个示例有效,那么为什么这不起作用:
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;
}
Run Code Online (Sandbox Code Playgroud)
即使我们在编译时尝试删除指针,如下所示:
constexpr int* return_ptr() {
return new int{ 1 };
}
constexpr void call_return_ptr(){
constexpr int* int_ptr = return_ptr();
delete int_ptr;
} …Run Code Online (Sandbox Code Playgroud) 我知道以下代码会导致链接错误:
//first.cpp
void test(){
//random code
}
//second.cpp
void test(){
//random code
}
Run Code Online (Sandbox Code Playgroud)
所以让我们说我们有这个函数模板:
template<typename T>
T test(){
//random code
}
Run Code Online (Sandbox Code Playgroud)
并且正在这样做:
//first.cpp
...
test<void>();
//second.cpp
...
test<void>();
Run Code Online (Sandbox Code Playgroud)
所以我理解编译器如何工作的方式是它只关心每个文件,所以它只关心test<void>()必须有一个定义,因此它会创建一个。同样的事情也适用,second.cpp那么为什么我们在后期有两个定义时不会收到链接器错误test<void>。 (我认为这应该与第一个示例相同,其中两个void test()函数在单独的文件中导致链接错误)
如果这是重复的我很抱歉我真的不知道如何搜索这个。