Почему данный код вызывает переопределение аргументов?

void func(int value = 0);

int main()
{
    
    func();
    
    
}

void func(int value = 0) {

}

Я понимаю что нужно убрать значение по умолчанию в объявлении или в определении, но почему оно так не работатет?


Ответы (2 шт):

Автор решения: Harry

Вообще-то убрать нужно в определении, в объявлении не надо, иначе вызов func() не пройдет - компилятор не будет знать, что это может быть вызов с аргументом по умолчанию.

Как я понимаю, связано это в первую очередь с тем, что возможны ситуации, когда в определении значение аргумента по умолчанию не будет совпадать с таковым в объявлении, в особенности легко допустить такую ошибку (заметим, не всегда доступную для проверки компилятором!) при объявлении и определении в разных файлах. Потому и решено было запретить вообще — все равно ведь будет подставляться только одно значение, то, которое в объявлении и которое известно компилятору. То, что в определении — никак не может повлиять на такую подстановку. А внести сумятицу может.

"По-моему, так" (с) Пух"

→ Ссылка
Автор решения: avp

В определении функции (т.е. там где ее код) никаких значений по умолчанию быть не должно.

Логика простая. Код функции всегда работает с переданными ему параметрами. В определении функции мы задаем их количество и тип.

А вот при вызове функции мы можем не писать все параметры, если компилятор из ее объявления будет понимать, какое значение вместо опущенного аргумента надо передавать в функцию.

Т.о. значения и типы аргументов "по умолчанию" надо писать в объявлении.

Кстати, вы можете иметь разные объявления одной и той же функции (в смысле разных значений (но не типов) параметров "по умолчанию") в разных файлах, откуда эта функция вызывается.

Например:

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$ 
→ Ссылка