Здравствуйте, enji, Вы писали:
E>ну и какие тут проблемы? Просто нельзя вызвать f с именоваными параметрами.
согласен, это согласуется с идеей ниже
E>Если у тебя в одной единице f(int a, int b), а в другой — f(int b, int a) — ну попытка вызвать f(.a=1, .b=2) — нарушение ODR. Такое же, как иметь две структуры с одинаковыми именами и разным содержимым.
это не согласуется с идеей ниже
E>Данная штука ведет себя примерно так же, как и параметры по умолчанию — т.е. разворачивается компилятором в обычный вызов функции сразу в месте вызова с той информацией, которая там компилятору доступна.
этот подход мне кажется вполне работоспособным
с другой стороны, ты выше написал про нарушение ODR, что противоречит этой идее. никакого нарушения не должно быть в примере выше, имена параметров не должны быть частью сигнатуры и проблем с экспортированными функциями опять же не будет
для случаев типа
//a.cpp
void f(int a, int b); // определение где-то в другом месте: в другом файле или либе
void f(int b, int a);
void g()
{
f(.a = 4, .b = 5); //line (1)
}
надо просто отрубать возможность использования именованных аргументов (не компилировать такой код в строке (1) )
для дефолтных значений параметров ведь в стандарте есть несколько предложений для разруливания конфликтов, когда несколько объявлений идут в одной единице трансляции. можно что-то аналогичное прописать и для имен параметров