Функция, не являющаяся членом, может быть объявлена несколько раз, а функция-член может быть объявлена только один раз?
Функция без числа может быть удалена несколько раз, а функция-член может быть объявлена только один раз? Это правильно? Мой пример говорит да.
Но почему?
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
функции, поэтому они должны были быть разрешены.
Это определенность работает, но я думаю, что это плохая практика.