Функция, не являющаяся членом, может быть объявлена ​​несколько раз, а функция-член может быть объявлена ​​только один раз?

Функция без числа может быть удалена несколько раз, а функция-член может быть объявлена ​​только один раз? Это правильно? Мой пример говорит да.

Но почему?

class Base{
public:
    int foo(int i);
    //int foo(int i=10); //error C2535: 'void Base::foo(int)' : member function already defined or declared
};

//but it seems ok to declare it multiple times
int foo(int i);
int foo(int i=10);

int foo(int i)
{
    return i;
}

int main (void)
{
    int i = foo();//i is 10 
}

3 ответа

Решение

Из Стандарта (2003), §8.3.6/4 говорится,

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

Пример из самого стандарта:

void f(int, int);
void f(int, int = 7);

Второе объявление добавляет значение по умолчанию!

Также см. §8.3.6/6.

И интересная (и несколько связанная) тема:

И §9.3/2,

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

Надеюсь, это поможет.

Вы получаете тот же результат с этой упрощенной версией:

int foo() ;
int foo() ; // OK -- extern functions may be declared more than once
class C {
  int foo() ;
  int foo() ; // Error -- member function may not be declared more than once
} ;

Возможно, причина историческая - много C код, используемый для объявления extern функции, поэтому они должны были быть разрешены.

Это определенность работает, но я думаю, что это плохая практика.

Другие вопросы по тегам