Почему аргументы по умолчанию в C++ являются конечными?Почему аргументы по умолчанию являются конечными?
ответ
, если у вас было void func(int a = 0, int b);
, как бы вы указали использовать параметр по умолчанию при вызове этой функции?
Я знаю, что вы не можете в C++, но другие языки обрабатывают это с помощью 'func (, some_val_for_b)' или именованных параметров. –
@ Доминистский Роджер: для меня это выглядит действительно уродливо. – dierre
@ Dominic Rodger, ну, C++ - нет. Если вы хотите, вы можете подать в суд на Stroupstroup: P –
Потому что в вызове функции вы должны вызвать аргументы, отличные от значения по умолчанию, в любом случае. Если вы поместите свой аргумент по умолчанию в начало списка аргументов, как вы должны сказать, что вы устанавливаете аргумент по умолчанию или другие?
Что делает начало списка настолько принципиально отличным от конца списка? Списки симметричны! –
Да, но представьте себе: void func (int a, int b = 0, int c, int d = 0); Что вы делаете, когда вызываете func (1, 2, 3); –
И какой конец списка, собственно, 'b' on? –
Просто, чтобы дополнить ответ @ tenfour. C++ FAQ В Lite есть тема, описывающая named parameters, и я думаю, что тема затрагивает вашу проблему в некоторой степени.
Потому что именно так разработан язык.
Более интересный вопрос: какие альтернативы?
Предположим, у вас есть void f(A a = MyA, B b);
- Placeholder/пустой аргумент:
f(_, abee)
илиf(, abee)
- Именованные аргументы (например, в Python):
f(b = abee)
Но те тонкости, и, конечно, не надо, потому что в отличие от Python C++ поддерживает перегрузку функции:
void f(A a, B b);
void f(B b) { f(MyA, b); }
и, таким образом, аргументы по умолчанию не нужны ... особенно с учетом того, что существуют проблемы при использовании ОО-кода, потому что аргументы по умолчанию статически разрешены (во время компиляции)
struct Base
{
virtual void func(int g = 3);
};
struct Derived
{
virtual void func(int g = 4);
};
int main(int argc, char* argv[])
{
Derived d;
d.func(); // Derived::func invoked with g == 4
Base& b = d;
b.func(); // Derived::func invoked with g == 3 (AH !!)
}
EDIT: по названным параметрам ->
функция может быть эмулирована с использованием функциональных объектов.
class Func
{
public:
Func(B b): mA(MyA), mB(b) {}
A& a(A a) { mA = a; }
B& b(B b) { mB = b; }
void operator()() { func(mA, mB); }
private:
A mA;
B mB;
};
int main(int argc, char* argv[])
{
A a; B b;
Func(b)();
Func(b).a(a)();
}
В случае, если вы не хотите копировать аргументы, у вас есть возможность использовать ссылки/указатели, хотя это может усложниться.
Это удобная идиома, когда у вас есть множество дефолтов без реального порядка приоритета.
Перегрузка функций не помогает, если 'A' и' B' являются одинаковыми типами ... –
@ Oli: why? учитывая первый прототип 'func', ясно, что если есть только один параметр, то для первого параметра следует использовать значение по умолчанию, независимо от их типа. Вещи становятся волосатыми, когда у вас есть два значения по умолчанию:) В общем, названные параметры - единственное, что может решить проблему, и что здорово, что они являются решением для компиляции. –
Да, вы правы. Я думал, вы используете перегрузку, чтобы устранить «func (A a, B b)», «func (B b)» и «func (A a)». –
- 1. шаблона аргументы по умолчанию
- 2. Почему эти аргументы по умолчанию для событий?
- 3. Почему эти аргументы по умолчанию разрешены?
- 4. C аргументы по умолчанию
- 5. По умолчанию аргументы контейнера
- 6. по умолчанию Аргументы функции
- 7. По умолчанию аргументы строки
- 8. JVM по умолчанию Аргументы
- 9. Почему аргументы, не относящиеся к умолчанию, соответствуют аргументам по умолчанию?
- 10. аргументы по умолчанию в Python
- 11. PHP - аргументы функции по умолчанию
- 12. аргументы по умолчанию в конструкторе
- 13. Python аргументы и аргументы по умолчанию
- 14. Почему унаследованный конструктор не наследует аргументы по умолчанию?
- 15. fortran 77 аргументы по умолчанию
- 16. Scala аргументы опциональный по умолчанию
- 17. Co-зависимые аргументы по умолчанию
- 18. По умолчанию Аргументы в Matlab
- 19. Почему аргументы main() не являются константными?
- 20. Динамические аргументы по умолчанию в функциях python
- 21. По умолчанию аргументы шаблона для шаблонов функций
- 22. Вложения RelusGrad от TensorFlow не являются конечными
- 23. Почему не удается ввести необязательные аргументы по умолчанию Null?
- 24. Многопроцессорность Python - Почему использование functools.partial медленнее, чем аргументы по умолчанию?
- 25. Почему аргументы шаблона по умолчанию не работают при использовании объявлений?
- 26. Почему аргументы по умолчанию оцениваются во время определения в Python?
- 27. По умолчанию все аргументы функции обязательны.
- 28. аргументы по умолчанию в функции - Python
- 29. Почему события инструмента формы являются приватными по умолчанию?
- 30. Почему коллекции scala не являются «представлениями» по умолчанию?
Ответ, который вы выбрали, не отвечает на ваш вопрос. – juanchopanza