Каковы правила для указателей на функции и указателей на функции-члены для стандартных функций?

Каковы существующие правила приведения указателей на функции или указателей на функции-члены к стандартным функциям? Например, что-то вроде

auto p = &std::string::size;

Это законно? Было бы более или менее законно, если бы я явно запросил правильный тип, чтобы он функционировал, даже если бы была дополнительная перегрузка, добавленная реализацией std::string::size?

7

Решение

Использование «правильного» типа не делает вещи лучше: за исключением virtual Функции Все функции в стандартной библиотеке C ++ могут иметь дополнительные аргументы, если они по умолчанию. Поскольку функции также могут быть объявлены с дополнительными перегрузками (опять же, за исключением virtual функция), вы можете попытаться назначить перегрузку для переменной. Таким образом, код не является переносимым, и нет способа сделать его переносимым, используя какой-то тип преобразования или некоторую сигнатуру вместо auto,

Соответствующая цитата 17.6.5.5 [member.functions] параграф 1:

Реализация может объявить дополнительные не виртуальные сигнатуры функций-членов в классе:
— путем добавления аргументов со значениями по умолчанию к сигнатуре функции-члена;
— путем замены сигнатуры функции-члена значениями по умолчанию двумя или более сигнатурами функции-члена с эквивалентным поведением; а также
— путем добавления сигнатуры функции-члена для имени функции-члена.

Я не вижу аналогичного разрешения для функций, не являющихся членами, хотя. Не уверен, где скрывается разрешение на связывание с ними, но я относительно уверен, что есть несколько слов ласки для них. Если посмотреть дальше, кажется, что функции, не являющиеся членами, более ограничены в соответствии с пунктом 3 [global.functions] 17.6.5.4:

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

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

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]