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 должно быть обобщено на такой случай.
Я прав?
Вызовы функций в C ++ подвержены разрешению перегрузки функций. Разрешение перегрузки определяется типами аргументов. То есть язык «работает» именно в этом направлении: от типы аргументов в конкретная версия функции с указанным именем.
Вы предлагаете ввести обратный процесс — вывод типа аргумента на основе имени функции. Это не будет работать в общем случае. Это может работать в случаях, когда есть только одна функция-кандидат (как в вашем примере), но, опять же, это противоречит принципам, которые работают в общей ситуации, когда функция перегружена.
Конечно, ситуация станет еще сложнее, когда поиск имени по неквалифицированному имени X
можно увидеть что-то еще с именем X
в дополнение к вашему A::X
, Я думаю, что это может легко стать очень нелогичным.
Я думаю, что правило ADL должно быть обобщено на такой случай.
Нет, спасибо.
C ++ имеет свою долю (неприятных) сюрпризов (какой другой язык вы знаете, требует explicit
как ключевое слово?), и я не вижу достаточных достоинств в вашем примере, чтобы добавить в этот список неожиданные языковые правила, мешающие моему коду в непредвиденных ситуациях.
Если вы находите дополнительную типизацию, связанную с именем класса, за которой следуют две двоеточия, слишком большими усилиями, то наверняка общая барочная природа синтаксиса C ++ должна была вас оттолкнуть к настоящему времени?