我有一个包含结构Library
的类Transaction
,并且该结构具有类型为Patron
的成员变量。
class Patron {
public:
Patron() { }
};
class Library {
public:
struct Transaction {
Patron p;
Transaction(Patron pp) :p(pp) { }
Transaction();
};
};
对于Transaction
的默认构造函数,我有一个函数default_transaction()
返回一个静态对象的const引用,如Stroustrup在“Programming - Principles and Practices using C ++”中所推荐的那样(p.324) ;推理:避免将默认值构建到构造函数代码中,避免全局变量和相关的初始化问题。
const Library::Transaction& default_transaction()
{
static Library::Transaction tt = Library::Transaction(Patron());
return tt;
}
Library::Transaction::Transaction()
:p(default_transaction().p) { }
int main()
{
Library::Transaction t;
}
如果我更改此行
static Library::Transaction tt = Library::Transaction(Patron());
到
static Library::Transaction tt(Patron());
,从“显式”初始化样式到“口语”,我得到一个错误:“具有块范围的静态函数是非法的”。
为什么?这不是两个相同的?错误究竟意味着什么?
答案 0 :(得分:3)
static Library::Transaction tt(Patron());
这被解析为名为static
的{{1}}(存储,而不是静态成员)函数的声明,该函数返回tt
并采用未命名的函数作为单一论点。参数函数不带任何值,并返回Library::Transaction
。