Ben*_* W. 5 c++ static scope initialization
我有一个Library包含 struct 的类Transaction,并且该结构有一个类型为 的成员变量Patron。
class Patron {
public:
Patron() { }
};
class Library {
public:
struct Transaction {
Patron p;
Transaction(Patron pp) :p(pp) { }
Transaction();
};
};
Run Code Online (Sandbox Code Playgroud)
对于 的默认构造函数Transaction,我有一个函数default_transaction()返回对静态对象的 const 引用,如 Stroustrup 在“编程 – 使用 C++ 的原理和实践”(第 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;
}
Run Code Online (Sandbox Code Playgroud)
如果我改变这一行
static Library::Transaction tt = Library::Transaction(Patron());
Run Code Online (Sandbox Code Playgroud)
到
static Library::Transaction tt(Patron());
Run Code Online (Sandbox Code Playgroud)
即,从“显式”初始化样式到“口语”,我收到错误:“具有块作用域的静态函数是非法的”。
这是为什么?两者不是等价的吗?该错误到底意味着什么?
static Library::Transaction tt(Patron());
Run Code Online (Sandbox Code Playgroud)
static这被解析为名为(存储,非静态成员)函数的声明tt,该函数返回 aLibrary::Transaction并采用未命名函数作为单个参数。参数函数不接受任何值并返回 a Patron。