问题(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可以解读为两种以上的意思, 不知道要选哪一种吗?
感谢赐教.