小编Cla*_*ssY的帖子

使用 constexpr 返回指针

从 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)

c++ constexpr c++20

13
推荐指数
1
解决办法
546
查看次数

模板实例化如何不会导致链接错误

我知道以下代码会导致链接错误:

//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()函数在单独的文件中导致链接错误)

如果这是重复的我很抱歉我真的不知道如何搜索这个。

c++ templates

5
推荐指数
1
解决办法
99
查看次数

标签 统计

c++ ×2

c++20 ×1

constexpr ×1

templates ×1