gpt4 book ai didi

c++ - 我不明白在 C++14 的 [namespace.memdef]/3 中的示例中,模板函数如何成为类 A::X::Y 的友元

转载 作者:搜寻专家 更新时间:2023-10-31 00:12:14 25 4
gpt4 key购买 nike

考虑以下 C++14 中 [namespace.memdef]/3 示例中的代码:

// Assume f and g have not yet been declared.
void h(int);
template <class T> void f2(T);
namespace A {
class X {
friend void f(X); // A::f(X) is a friend
class Y {
friend void g(); // A::g is a friend
friend void h(int); // A::h is a friend
// ::h not considered
friend void f2<>(int); // ::f2<>(int) is a friend
};
};
// A::f, A::g and A::h are not visible here
X x;
void g() { f(x); } // definition of A::g
void f(X) { /* ... */} // definition of A::f
void h(int) { /* ... */ } // definition of A::h
// A::f, A::g and A::h are visible here and known to be friends
}

using A::x;
void h() {
A::f(x);
//A::X::f(x); // error: f is not a member of A::X
//A::X::Y::g(); // error: g is not a member of A::X::Y
}

我不明白为什么::f2<>(int)是类的 friend A::X::Y .名称的查找不应该在 namespace A 处停止吗? ?如何允许找到::f2 ?为什么h的处理方式有区别?和 f2

最佳答案

它不必在命名空间 A 中.我认为混淆可能来自 [namespace.memdef]/3 中的这句话:

If the name in a friend declaration is neither qualified nor a template-id and the declaration is a function or an elaborated-type-specifier, the lookup to determine whether the entity has been previously declared shall not consider any scopes outside the innermost enclosing namespace.

friend 中的名称有问题的声明是f2<> .这不是合格的,但它 template-id。因此,将限制查找到命名空间 A 的子句根本不适用。我们在 f2 上进行标准的不合格查找寻找::f2 .

考虑您在 h 之间复制的示例中的差异和 f2 :

friend void h(int);     // A::h is a friend
// ::h not considered
friend void f2<>(int); // ::f2<>(int) is a friend

h既不是合格的也不是 template-id,因此我们不会在最内层的封闭命名空间之外查看。由于我们没有找到 h 的任何内容在那里,我们应用 [namespace.memdef]/3 的第一句话:

If a friend declaration in a non-local class first declares a class, function, class template or function template the friend is a member of the innermost enclosing namespace.

因此该特定行声明了一个 void A::h(int) ,这是一个 friendA::X::Y .

关于c++ - 我不明白在 C++14 的 [namespace.memdef]/3 中的示例中,模板函数如何成为类 A::X::Y 的友元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31004483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com