[问题] std::thread+functor

楼主: Keitaro (动き出す时间...)   2023-01-16 23:33:40
问题(Question):
https://www.books.com.tw/products/0010676124
这两天刚开始看这本书, 初始章节有一段写的我怎么看都看不懂, 恳请版上高手解惑
class background_task
{
public:
void operator()() const
{
// do something
}
};
background_task f;
std::thread my_thread(f);
以上的程式码 搭配书上底下这一段文字说明
将函示物件传入直行绪建构子时还有其他额外的考量, 就是避免"C++最令人讨厌的剖析
(C++'s most vexing parse)", 如果传入的是暂存物件而不是具有名称的变量, 语法上
会与函示宣告相同, 编译器也会这么解读, 而不是视为物件定义, 例如
std::thread my_thread(background_task());
会宣告一个my_thread函式, 具有一个参数(参数型别是没有参数且传回background_task
物件的函示指标), 并传回std::thread物件, 而不是启动新执行绪, 可以使用之前的方
式先提供函示物件变量名称、使用额外的刮号, 或者使用新的统一初始语法(uniform
unitialization syntax):
std::thread my_thread((background_task())); <-1
std::thread my_thread{background_task()}; <-2
第一个例子, 使用额外的刮号以避免被作为函示宣告解读. 就能够让my_thread被宣告
为std::thread型别的变量, 第二个例子则使用了新的统一初始语法, 使用大刮号而非
小刮号, 同样也会被视为宣告变量.
以上这一段我不太能理解
std::thread my_thread(background_task());
这样的写法, background_task() 这不是隐式宣告产生暂时物件吗?
跟显式宣告一个background_task型别的f变量, 再把f丢进my_thread当参数, 差异在哪?
我不明白书上写的C++'s most vexing parse意思为何?
是指这样的写法, compiler可以解读为两种以上的意思, 不知道要选哪一种吗?
感谢赐教.
作者: LPH66 (-6.2598534e+18f)   2023-01-16 23:54:00
编译器可以解读为两种以上的意思←正确但 most vexing parse 困扰的点在于语言规定要选函数宣告就算在那里解读成呼叫函数会让程式正确也不行
作者: Dracarys (MayShowGunMore)   2023-01-17 03:20:00
background_task()被当成function type。可以想成function decl的名字拿掉:background_task id()把id拿掉如此一来第一种就可被parsed成function declhttps://godbolt.org/z/ETjrqrc88
楼主: Keitaro (动き出す时间...)   2023-01-18 13:36:00
感谢以上各位
作者: LenaPark   2023-01-19 00:19:00
顺便推荐 Effective Modern C++ 条款7,有中文版。

Links booklink

Contact Us: admin [ a t ] ucptt.com