Почему данный код вызывает переопределение аргументов?
void func(int value = 0);
int main()
{
func();
}
void func(int value = 0) {
}
Я понимаю что нужно убрать значение по умолчанию в объявлении или в определении, но почему оно так не работатет?
Ответы (2 шт):
Вообще-то убрать нужно в определении, в объявлении не надо, иначе вызов func() не пройдет - компилятор не будет знать, что это может быть вызов с аргументом по умолчанию.
Как я понимаю, связано это в первую очередь с тем, что возможны ситуации, когда в определении значение аргумента по умолчанию не будет совпадать с таковым в объявлении, в особенности легко допустить такую ошибку (заметим, не всегда доступную для проверки компилятором!) при объявлении и определении в разных файлах. Потому и решено было запретить вообще — все равно ведь будет подставляться только одно значение, то, которое в объявлении и которое известно компилятору. То, что в определении — никак не может повлиять на такую подстановку. А внести сумятицу может.
"По-моему, так" (с) Пух"
В определении функции (т.е. там где ее код) никаких значений по умолчанию быть не должно.
Логика простая. Код функции всегда работает с переданными ему параметрами. В определении функции мы задаем их количество и тип.
А вот при вызове функции мы можем не писать все параметры, если компилятор из ее объявления будет понимать, какое значение вместо опущенного аргумента надо передавать в функцию.
Т.о. значения и типы аргументов "по умолчанию" надо писать в объявлении.
Кстати, вы можете иметь разные объявления одной и той же функции (в смысле разных значений (но не типов) параметров "по умолчанию") в разных файлах, откуда эта функция вызывается.
Например:
File tf.cpp
#include <stdio.h>
void pfoo2 (int a, int b = 10);
void foo(void);
int main(int c, char **v)
{
puts("start");
foo();
puts("main");
pfoo2(1);
return 0;
}
File tfoo.cpp
#include <stdio.h>
void pfoo2 (int a, int b = 20);
void
foo ()
{
puts("foo");
pfoo2(2);
}
File tpfoo2.cpp
#include <stdio.h>
void pfoo2 (int a, int b)
{
printf("pfoo2: a = %d b = %d\n",
a, b);
}
Компилируем и запускаем:
avp@avp-desktop:~/avp/hashcode$ g++ tf.cpp tfoo.cpp tpfoo2.cpp && ./a.out
start
foo
pfoo2: a = 2 b = 20
main
pfoo2: a = 1 b = 10
avp@avp-desktop:~/avp/hashcode$