作者Keitaro (动き出す时间...)
看板C_and_CPP
标题[问题] std::thread+functor
时间Mon Jan 16 23:33:40 2023
问题(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可以解读为两种以上的意思, 不知道要选哪一种吗?
感谢赐教.
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.36.112.181 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1673883222.A.D53.html
※ 编辑: Keitaro (114.36.112.181 台湾), 01/16/2023 23:35:13
1F:推 LPH66: 编译器可以解读为两种以上的意思←正确 01/16 23:54
2F:→ LPH66: 但 most vexing parse 困扰的点在於语言规定要选函数宣告 01/16 23:55
3F:→ LPH66: 就算在那里解读成呼叫函数会让程式正确也不行 01/16 23:55
4F:推 Dracarys: background_task()被当成function type。可以想成funct 01/17 03:20
5F:→ Dracarys: ion decl的名字拿掉:background_task id()把id拿掉 01/17 03:20
6F:→ Dracarys: 如此一来第一种就可被parsed成function decl 01/17 03:21
意思是说, my_thread的参数, 如果使用background_task() 隐式宣告,
compiler会解读为 把建构式background_task::background_task()
拿来当作my_thread启动thread後要执行的function call?
※ 编辑: Keitaro (210.242.38.175 台湾), 01/17/2023 15:09:17
8F:→ Dracarys: MVP的意思是语法上可以parse成function declaration就 01/17 18:33
9F:→ Dracarys: 要这麽解读,你的my_thread会变成function declaration 01/17 18:33
10F:→ Dracarys: 其参数为function pointer(没参数且return type为back 01/17 18:33
11F:→ Dracarys: ground_task) 01/17 18:33
12F:→ Keitaro: 感谢以上各位 01/18 13:36
13F:推 LenaPark: 顺便推荐 Effective Modern C++ 条款7,有中文版。 01/19 00:19