Почему C ++ 11 не поддерживает поиск имени таким образом?

struct A
{
enum InnerEnum { X };

A(InnerEnum x)
{}
};

int main()
{
A a(X);
}

Компилятор жалуется: error C2065: 'X' : undeclared identifier

Компилятор знает, каков тип параметра конструктора, поэтому, когда я передаю X в качестве аргумента, компилятор должен знать, что это допустимый аргумент.

Я знаю, что это не ADL (Аргумент-зависимый поиск имени, также известный как поиск Кенига), но я думаю, что это полезно и довольно удобно. Потому что мне не нужно писать следующее:

A a(A::X);

Я думаю, что правило ADL должно быть обобщено на такой случай.

Я прав?

5

Решение

Вызовы функций в C ++ подвержены разрешению перегрузки функций. Разрешение перегрузки определяется типами аргументов. То есть язык «работает» именно в этом направлении: от типы аргументов в конкретная версия функции с указанным именем.

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

Конечно, ситуация станет еще сложнее, когда поиск имени по неквалифицированному имени X можно увидеть что-то еще с именем X в дополнение к вашему A::X, Я думаю, что это может легко стать очень нелогичным.

10

Другие решения

Я думаю, что правило ADL должно быть обобщено на такой случай.

Нет, спасибо.

C ++ имеет свою долю (неприятных) сюрпризов (какой другой язык вы знаете, требует explicit как ключевое слово?), и я не вижу достаточных достоинств в вашем примере, чтобы добавить в этот список неожиданные языковые правила, мешающие моему коду в непредвиденных ситуациях.

Если вы находите дополнительную типизацию, связанную с именем класса, за которой следуют две двоеточия, слишком большими усилиями, то наверняка общая барочная природа синтаксиса C ++ должна была вас оттолкнуть к настоящему времени?

4

По вопросам рекламы [email protected]