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

时间:2014-02-03 18:22:57

标签: c++ static scope initialization

我有一个包含结构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());

,从“显式”初始化样式到“口语”,我得到一个错误:“具有块范围的静态函数是非法的”。

为什么?这不是两个相同的?错误究竟意味着什么?

1 个答案:

答案 0 :(得分:3)

static Library::Transaction tt(Patron());

这被解析为名为static的{​​{1}}(存储,而不是静态成员)函数的声明,该函数返回tt并采用未命名的函数作为单一论点。参数函数不带任何值,并返回Library::Transaction