Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过using声明将函数交朋友合法吗?_C++_Language Lawyer - Fatal编程技术网

C++ 通过using声明将函数交朋友合法吗?

C++ 通过using声明将函数交朋友合法吗?,c++,language-lawyer,C++,Language Lawyer,以下内容被GCC 4.7.2、GCC 4.8.0和ICC 13.0.1拒绝 namespace A { namespace B { void C(); } using B::C; } class D { friend void A::C(); }; 此外,它还崩溃了Clang3.2(!)。我已经提交了一份错误报告,对于崩溃错误,我不能100%确定这段代码是否真的有错误,因为我在§7.3.3[namespace.udecl]或§11.3[clas

以下内容被GCC 4.7.2、GCC 4.8.0和ICC 13.0.1拒绝

namespace A {
    namespace B {
        void C();
    }
    using B::C;
}

class D {
    friend void A::C();
};
此外,它还崩溃了Clang3.2(!)。我已经提交了一份错误报告,对于崩溃错误,我不能100%确定这段代码是否真的有错误,因为我在§7.3.3[namespace.udecl]§11.3[class.friend]中找不到明确解决此问题的任何内容,但是,在各种名称说明符术语的定义中,我可能遗漏了一些东西

此外,似乎所有四个编译器都接受以下内容:

这两个案例似乎没有什么根本性的不同,所以我很好奇GCC和ICC拒绝第一个案例而不是这一个的理由是什么,如果有的话。熟悉该标准的人能找到解决这个问题的方法吗

这绝对是一个小问题,最多,但因为我正在修补它,我想确定我做的是正确的事情

编辑

新编辑:Johannes下面的回答解释了我的原始示例被拒绝的原因,但似乎没有解释GCC和ICC也拒绝以下内容的原因:

8.3p1:

当声明器id被限定时, 该声明应引用该限定符所指向的类或命名空间的先前声明的成员 引用(或者,对于命名空间,引用该命名空间(7.3.1)的内联命名空间集的元素) 或其专门化成员不应仅通过使用声明介绍 在由declarator-id的嵌套名称说明符指定的类或命名空间的范围内。


A
foo类
类foo::bar
不包含声明器id,因此不受此规则的影响。相反,
foo::bar
是一个精心设计的类型说明符(7.1.6.3)的一部分。

那么为什么类版本是ok的呢?ok,+1对我来说很有意义。这也是一件好事,否则这将需要更多的努力来解决:不过我不知道其原理。这正是规范中出现的规则。如果这对您有帮助,我很高兴。不,我真的不在乎,只是确保我做了正确的事情:)如果您想详细说明声明器id和详细说明的类型说明符之间的区别,这可能会对遇到此问题的其他人有所帮助,如果没有,我就自己读一读。嘿,你能看看我最近的编辑,看看你能不能找出GCC和ICC拒绝它的原因?它不使用限定名称。
namespace A {
    namespace B {
        class C;
    }
    using B::C;
}

class D {
    friend class A::C;
};
namespace A {
    namespace B {
        void C();
    }
    using B::C;

    class D {
        friend void C();
    };
}