Существует ли техническая причина того, что нельзя использовать декларацию использования для создания имени функции под другим именем?
Рассмотрим
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.)
}
Возможно, кто-то, кто присутствовал на недавних встречах стандартов, мог взвесить, на что реакция на это предложение.