перегрузка против параметров по умолчанию в стандарте c ++ - PullRequest
11 голосов
/ 17 февраля 2011

Я читал другой вопрос, и это заставило меня задуматься.Часто стандарт определяет функции, которые имеют параметры по умолчанию в своих описаниях.Позволяет ли стандарт вместо этого записывать их как перегрузки?

Например, стандарт говорит, что std::basic_string::copy имеет следующее объявление:

size_type copy(Ch* p, size_type n, size_type pos = 0) const;

Может ли соответствующая реализация стандартной библиотеки реализовать этовместо двух функций, подобных этой?

size_type copy(Ch* p, size_type n, size_type pos) const;
size_type copy(Ch* p, size_type n) const;

В этом примере вторая версия может пропустить тест if(pos > size()) { throw out_of_range(); }, необходимый в первой.Микрооптимизация, но все же вы видите смысл примера.

1 Ответ

16 голосов
/ 17 февраля 2011

Может ли соответствующая реализация стандартной библиотеки реализовать это вместо двух подобных функций?

Да. Стандарт C ++ (C ++ 03 17.4.4.4/2-3) гласит:

Реализация может объявлять дополнительные не виртуальные сигнатуры функций-членов в классе [Standard Library]:

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

- путем замены сигнатуры функции-члена значениями по умолчанию двумя или более сигнатурами функции-члена с эквивалентным поведением;

- путем добавления сигнатуры функции-члена для имени функции-члена.

Вызов подписи функции-члена, описанной в стандартной библиотеке C ++, ведет себя так же, как если бы реализация не объявляла никаких дополнительных подписей функции-члена

...