Перегрузка по умолчанию в стандарте С++

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

Например, в стандарте указано, что 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

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

Да. В стандарте С++ (С++ 03 17.4.4.4/2-3) говорится:

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

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

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

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

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