如何为好友函数中定义的 class 赋予友谊?

How is friendship conferred for a class defined within a friend function?

这个问题不言自明,但如果需要,这里有一个例子:

假设我有一个带有私有构造函数的 class 'Thing',它是具有函数 'make_thing':

的朋友
class Thing
{
    friend std::shared_ptr<Thing> make_thing();

    Thing()
    {
        std::cout << "Thing constructor" << std::endl;
    }
};

'make_thing' 函数内部定义了一个结构:

std::shared_ptr<Thing> make_thing()
{
    // err: Thing::Thing() is private within make_shared
    // auto thing = std::make_shared<Thing>();

    // this is okay
    struct AccessThing : public Thing {
        AccessThing() : Thing() { }
    };

    auto thing = std::make_shared<AccessThing>();
    return thing;
}

这在 gcc 4.8.2、clang 3.5 和 msvc 2013 中编译和工作。我不能调用

make_shared<Thing>()

因为 Thing 有一个私有的构造函数。但是,我可以通过使用 public 构造函数创建一个结构 (AccessThing) 来解决这个问题,该构造函数依次调用 Thing 的私有构造函数,然后将其传递给 make_shared。对我来说,如果 AccessThing 是 Thing 的朋友,这是有道理的。

那么关于如何将友谊授予 structs/classes 在朋友函数中定义的规则是什么?

这是本地标准部分的第一段 类:

A class can be declared within a function definition; such a class is called a local class. The name of a local class is local to its enclosing scope. The local class is in the scope of the enclosing scope, and has the same access to names outside the function as does the enclosing function.