gpt4 book ai didi

c++ - 未调用的函数对代码的结果有影响

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:47:01 26 4
gpt4 key购买 nike

在这里挠我的头。在下面的代码中,函数 f 通过 task_lambda()task_bind()task_thread() 以 3 种不同的方式使用。然而,在 main() 中,实际上只有函数 task_lambda()task_bind() 被调用和执行。但是,如果你胆敢取消注释 #if 0 代码块,这样未使用的函数 task_thread() 不再在代码中,那么 main 中的代码现在将抛出异常 (-1) system_error。

代码如下:

#include <iostream>                                                                                                                                                                                         
#include <cmath>
#include <thread>
#include <future>
#include <functional>
#include <unistd.h>

// unique function to avoid disambiguating the std::pow overload set
int f(int x, int y) { return std::pow(x,y); }

void task_lambda()
{
std::packaged_task<int(int,int)> task([](int a, int b) {
return std::pow(a, b);
});
std::future<int> result = task.get_future();

task(2, 9);

std::cout << "task_lambda:\t" << result.get() << '\n';
}

void task_bind()
{
std::packaged_task<int()> task(std::bind(f, 2, 11));
std::future<int> result = task.get_future();

task();

std::cout << "task_bind:\t" << result.get() << '\n';
}

//#if 0
void task_thread()
{
std::packaged_task<int(int,int)> task(f);
std::future<int> result = task.get_future();

std::thread task_td(std::move(task), 2, 10);
task_td.detach();
}
//#endif

int main()
{
task_lambda();
task_bind();
sleep(1);
}

这到底是什么意思?

编辑 - 添加工具链信息:

Ubuntu 16.04 - Linux 4.4.0-154-generic

gcc 版本 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.11)

最佳答案

使用不正确的链接器标志 -lpthreads 而不是 -pthreads 编译代码。

一旦使用了 -pthreads 标志,代码现在可以使用或不使用未使用的函数。

仍然不确定如果没有未使用的代码,它会如何导致代码无法工作。

关于c++ - 未调用的函数对代码的结果有影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57099445/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com