下面 [over.load]/1 中突出显示的句子是什么意思?

What's the meaning of the highlighted sentence below in [over.load]/1?

提问人:Alexander 提问时间:7/15/2019 最后编辑:curiousguyAlexander 更新时间:7/17/2019 访问量:172

问:

下面突出显示的句子是什么意思?它与函数模板有什么关系吗?

[过载]/1

并非所有函数声明都可以重载。那些不能的 此处指定了重载。如果程序包含以下内容,则该程序的格式不正确 在同一作用域中有两个这样的不可重载声明。[ 注意: 这个 限制适用于作用域中的显式声明,以及作用域中的显式声明 此类声明和通过使用声明作出的声明 ([namespace.udecl]). 它不适用于制造的函数集 由于名称查找(例如,由于 using 指令)或 过载分辨率(例如,用于操作员功能)。——尾注 ]

C++ 重载 language-lawyer using-directives name-lookup

评论

0赞 Jesper Juhl 7/15/2019
注意:除了引用的内容外,值得注意的是,您也不能在返回值上重载。

答:

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 嗯,是的,声明本身本身不做任何查找,但名称查找使用它来查看命名空间。我不明白你的意思,你能澄清一下吗?