gpt4 book ai didi

C++ 将类型名/数据类型名/类名传递给线程构造函数的奇怪案例

转载 作者:行者123 更新时间:2023-11-30 02:22:15 24 4
gpt4 key购买 nike

经过多年的 Java/Node.js 编程之后,我又回到了 C++,因此,我与模板脱节了(我正在研究它)。

在修改并发时,无意中发现了下面的情况

class Test
{
};

int main()
{
std::thread t(Test);
}

我正在试验的是,如果我传递一个不可调用的对象会怎样,然后我会研究错误和源代码。但是我不小心传递了类型名称。程序编译运行没有问题,我很困惑。

然后我尝试了一些更愚蠢的东西

int main()
{
std::thread t1(int);
}

不知何故它也起作用了。虽然这两个案例编译并运行正常。我不明白怎么办。如果它尝试 t.join()t1.join() 我得到以下编译错误

t.join() cannot be resolved

我只是不明白在这两种情况下发生了什么,以及 t.join() 是如何无法解决的。

到目前为止我对此的研究

我花了很多时间试图弄清楚编译器如何确定给定值是否可调用。我看到了这个链接:find out if a C++ object is callable由于成员检测惯用语,这很有意义,但是当我检查 gcc 的源代码时,它似乎使用了函数头文件/库的 std::_Bind_simple 来解决这个问题。但这并没有解决我的查询。那么,这个帖子how std::thread constructor detects rvalue reference?问了类似的问题,但答案对我来说毫无意义。

我们将不胜感激任何形式的帮助

最佳答案

感谢@Jaroda42,我所做的是在本地范围内进行函数声明。

std::thread t(Test);

其中函数是t,返回类型是std::thread,参数是类类型Test

这真的很愚蠢,但如果一个人离开一门语言很长时间,就会得到这个结果。

关于C++ 将类型名/数据类型名/类名传递给线程构造函数的奇怪案例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47460813/

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