“具有块作用域的静态函数是非法的”错误取决于初始化样式?

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)

即,从“显式”初始化样式到“口语”,我收到错误:“具有块作用域的静态函数是非法的”。

这是为什么?两者不是等价的吗?该错误到底意味着什么?

Dav*_*eas 4

static Library::Transaction tt(Patron());
Run Code Online (Sandbox Code Playgroud)

static这被解析为名为(存储,非静态成员)函数的声明tt,该函数返回 aLibrary::Transaction并采用未命名函数作为单个参数。参数函数不接受任何值并返回 a Patron