提问人:Alexander 提问时间:7/15/2019 最后编辑:curiousguyAlexander 更新时间:7/17/2019 访问量:172
下面 [over.load]/1 中突出显示的句子是什么意思?
What's the meaning of the highlighted sentence below in [over.load]/1?
问:
下面突出显示的句子是什么意思?它与函数模板有什么关系吗?
并非所有函数声明都可以重载。那些不能的 此处指定了重载。如果程序包含以下内容,则该程序的格式不正确 在同一作用域中有两个这样的不可重载声明。[ 注意: 这个 限制适用于作用域中的显式声明,以及作用域中的显式声明 此类声明和通过使用声明作出的声明 ([namespace.udecl]). 它不适用于制造的函数集 由于名称查找(例如,由于 using 指令)或 过载分辨率(例如,用于操作员功能)。——尾注 ]
答:
11赞
Rakete1111
7/15/2019
#1
你可以做这样的事情:
namespace N {
void f(int);
}
namespace M {
int f(int);
}
using namespace N; // ok
using namespace M; // ok
// even if both have conflicting f's
你在这里没有直接超载任何东西。using 指令允许名称查找以查找这两个函数,此时调用是不明确的。
这里包含两个不可重载的函数集在那里,但由于它们是根据引号通过名称查找找到的,所以它们没问题。
评论
0赞
Alexander
7/16/2019
请注意,我的问题中突出显示的句子提到了 using 指令,而不是 using-declarations,这在您的示例中使用了。尽管如此,在接受你的回答时,我还是给了你怀疑的好处,因为这句话说的是“例如,因为使用指令”,这也可以解释为“因为使用声明”。但是现在我突然意识到,using 指令只查找类型名称,而不是函数名称。(将在下一条评论中继续)
0赞
Alexander
7/16/2019
因此,要么上面的句子有另一种解释,在这种情况下,你的答案是不正确的,要么是标准有缺陷,即上面对 using-directives 的引用是错误的,应该用 using-declarations 代替,在这种情况下,你的答案是正确的。你能澄清一下吗?
0赞
Rakete1111
7/16/2019
@Alexander “using 指令只查找类型名称,而不查找函数名称。”不,这是不正确的。您可以将 using 指令想象为命名空间中每个声明的 using 声明。您可以改用来获得相同的结果。using namespace N; using namespace M;
0赞
Alexander
7/16/2019
好吧,当我写“using 指令只查找类型名称,而不查找函数名称”时,我没有正确表达自己。但是,using 指令仍然不会在命名命名空间中查找任何名称。
1赞
Rakete1111
7/16/2019
@Alexander 嗯,是的,声明本身本身不做任何查找,但名称查找使用它来查看命名空间。我不明白你的意思,你能澄清一下吗?
下一个:在其命名空间外部定义的类成员函数
评论