Существует ли техническая причина того, что нельзя использовать декларацию использования для создания имени функции под другим именем?

Рассмотрим

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;

или что-то вроде этого даже считалось, но отвергалось? (Почему?)

Ответы

Ответ 1

См. N1489:

Можно обобщить понятие псевдонима вне типов и пространства имен к функциям, переменным и т.д. Мы не видим достаточных выгоды от этого и могут представить серьезное злоупотребление, приводящее к путаница в отношении того, какие функции и переменные используются. Вследствие этого, мы не предлагаем обобщений, упомянутых в этом разделе. Кроме того, мы не планируем работать дальше по этим обобщениям если кто-то не придумает примеры, которые Полезность.

Ответ 2

Я не могу придумать каких-либо технических причин для этого не существующего, я думаю, что это вопрос подходящего (неконфликтного) синтаксиса и значительно важного прецедента.

В настоящее время существует стандартное предложение , чтобы добавить псевдонимы функций на язык, чтобы поддерживать непрозрачные typedef. Согласно этой статье, эта функция ранее рассматривалась в начале 90-х годов, но отклонялась:

Stroustrup описал [функцию aliasing] в своей книге 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.)
}

Возможно, кто-то, кто присутствовал на недавних встречах стандартов, мог взвесить, на что реакция на это предложение.