考虑
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;
或有这样的事情甚至被考虑但被拒绝了? (为什么?)
答案 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.)
}
参加最近的标准会议的人也许可以权衡对提案的反应。