Расположение параметров функции C++ по умолчанию

// Case A
class Point {
private:
    int x;
    int y;
public:
    Point(int i = 0, int j = 0);  // Constructor
};

Point::Point(int i, int j)  {
    x = i;
    y = j;
    cout << "Constructor called";
}

// Case B:
class Point {
private:
    int x;
    int y;
public:
    Point(int i, int j);  // Constructor
};

Point::Point(int i = 0, int j = 0)  {
    x = i;
    y = j;
    cout << "Constructor called";
}

Вопрос> И Case A, и Case B компилируются без проблем с VS2010.

Оригинал Я предполагаю, что работает только случай A, потому что я помню, что параметры по умолчанию должны быть введены в том месте, где функция объявлена, а не в месте ее определения. Может ли кто-нибудь поправить меня в этом?

Спасибо


person q0987    schedule 20.08.2013    source источник
comment
См. это: stackoverflow.com/q/4989483/811335   -  person A. K.    schedule 20.08.2013
comment
Это дубликат вопроса, заданного несколько дней назад, когда выяснилось, что в стандарте С++ есть дефект, делающий этот код технически законным, но чрезмерно обременяющий реализацию. Я посмотрю, смогу ли я найти его.   -  person Mark B    schedule 20.08.2013
comment
возможный дубликат аргумента по умолчанию, gcc vs clang   -  person Mark B    schedule 20.08.2013


Ответы (1)


Если вы поместите параметры по умолчанию в определение метода, то только те, кто увидит определение, смогут использовать параметры по умолчанию. Единственная проблема была бы, если бы вы попробовали что-то вроде этого:

public:
    Point(int i = 0, int j = 0);

(...)

Point::Point(int i = 0, int j = 0) { ... }

Тогда вы получите ошибку времени сборки.

// РЕДАКТИРОВАТЬ: Но мне любопытно, что найдет Марк Б., как указано в комментарии под вашим вопросом.

// РЕДАКТИРОВАТЬ2: А также, по-видимому, компилятору clang не нравится случай B.

person Filip Vondrášek    schedule 20.08.2013
comment
Одной из целей параметров по умолчанию является документирование значений по умолчанию. Таким образом, размещение его в заголовке (объявлении) гораздо полезнее, чем размещение его в реализации (которую можно не увидеть, если, например, была создана статическая библиотека). Стандарт допускает и то, и другое, но я бы настоятельно не рекомендовал включать его в реализацию. - person Zac Howland; 20.08.2013
comment
Да, я имею в виду - это возможно сделать, но было бы глупо, если бы вы действительно это сделали. - person Filip Vondrášek; 20.08.2013