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

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

Но почему?

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 ]

6 голосов
/ 22 сентября 2011

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

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

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

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

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

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

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

А §9.3 / 2,

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

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

1 голос
/ 22 сентября 2011

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

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, поэтому их нужно было разрешить.

0 голосов
/ 22 сентября 2011

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

...