【问题标题】:Is there a technical reason for not allowing a using declaration to make a function name accessible under a different name?不允许使用声明使函数名称以不同的名称可访问是否有技术原因?
【发布时间】:2016-01-11 11:21:02
【问题描述】:

考虑

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

foo 中,可以通过foo::f 将所有foo::bar::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;

或者类似的事情被考虑过但被拒绝了? (为什么?)

【问题讨论】:

  • 解决方法:auto g = [](auto ...args){ foo::bar::f(std::forward<decltype(args)>(args)...); };
  • @KerrekSB:引入一个g,它的匹配度可能远远超过任何f
  • @Pixelchemist 好吧,可以使用 SFINAE 来规避这一点。
  • @Pixelchemist:是的,它会产生完全不同的重载集。
  • 问题的背景是需要将函数推送到嵌套命名空间中,以使 using std::f; 可用于尾随返回类型和 constexpr 规范。我想以不同的名称将它们拖出封闭的命名空间,因为它们所模仿的函数在 std 中具有相同的名称。

标签: c++ language-lawyer


【解决方案1】:

N1489:

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

【讨论】:

  • 换句话说:using 仅用于类型。技术原因是担心滥用/过度使用。
  • @einpoklum 没有技术原因(即障碍)。它只是不会构成改进
【解决方案2】:

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

目前有一个standards proposal 为语言添加函数别名以支持不透明类型定义。根据那篇论文,该功能在 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.)
}

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

【讨论】:

猜你喜欢
  • 2011-10-30
  • 2018-06-23
  • 2016-12-25
  • 2011-04-05
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
相关资源
最近更新 更多