是否有技术原因不允许使用声明来使用不同的名称访问函数名称?

时间:2016-01-11 11:21:03

标签: c++ language-lawyer

考虑

namespace foo
{
  namespace bar
  {
    void f();
    void f(int);
  }
}

foo中,可以通过

将所有foo::bar::f作为foo::f访问
using bar::f; // in foo

是否有任何技术原因导致语法不存在,使所有foo::bar::f可以像foo::g那样访问

using bar::f as g; 
// or in line with using declarations for types:
using g = bar::f;

或有这样的事情甚至被考虑但被拒绝了? (为什么?)

2 个答案:

答案 0 :(得分:23)

请参阅N1489

  

有可能将别名的概念概括为类型和   命名空间到函数,变量等我们看不到足够的   这样做的好处,可以想象严重的过度使用导致   关于使用哪些函数和变量的混淆。所以,   我们不建议本节中提到的概括。   此外,我们不打算进一步研究这些概括   除非有人提出表明重要的例子   效用

答案 1 :(得分:10)

我想不出有任何技术原因,我认为这是一个合适的(非冲突)语法和一个非常重要的用例的问题。

目前有一个standards proposal为语言添加功能别名,以支持 opaque typedefs 。根据那篇论文,这个特征以前是在90年代初考虑过的,但被拒绝了:

  

Stroustrup在他的D& E书中将[函数别名]描述为解决由于多个名称冲突导致的“重命名”功能   继承:“这个概念的语义很简单,实现起来很简单;该   问题似乎是要找到合适的语法。“他说这样的提议”已经提出   在1990年的西雅图标准会议上“并且,尽管最初是”大规模的   大多数人,“这个特征最终没有被采纳:”在下次会议上,。 。 。我们同意这样的   名称冲突不太可能足以保证单独的语言功能。“

建议的语法如下:

template< class RA, class R = std::less<> >
void
sort( RA b, RA const e, R lt = {} )
{
    using operator<() = lt; // operator < has type R
    // Remaining code in this scope uses infix < in place of calls to lt().
    // (A future proposal may suggest synthesis of other relational
    // operators from an operator< declared in this fashion.)
}

参加最近的标准会议的人也许可以权衡对提案的反应。