Каковы существующие правила приведения указателей на функции или указателей на функции-члены к стандартным функциям? Например, что-то вроде
auto p = &std::string::size;
Это законно? Было бы более или менее законно, если бы я явно запросил правильный тип, чтобы он функционировал, даже если бы была дополнительная перегрузка, добавленная реализацией std::string::size
?
Использование «правильного» типа не делает вещи лучше: за исключением virtual
Функции Все функции в стандартной библиотеке C ++ могут иметь дополнительные аргументы, если они по умолчанию. Поскольку функции также могут быть объявлены с дополнительными перегрузками (опять же, за исключением virtual
функция), вы можете попытаться назначить перегрузку для переменной. Таким образом, код не является переносимым, и нет способа сделать его переносимым, используя какой-то тип преобразования или некоторую сигнатуру вместо auto
,
Соответствующая цитата 17.6.5.5 [member.functions] параграф 1:
Реализация может объявить дополнительные не виртуальные сигнатуры функций-членов в классе:
— путем добавления аргументов со значениями по умолчанию к сигнатуре функции-члена;
— путем замены сигнатуры функции-члена значениями по умолчанию двумя или более сигнатурами функции-члена с эквивалентным поведением; а также
— путем добавления сигнатуры функции-члена для имени функции-члена.
Я не вижу аналогичного разрешения для функций, не являющихся членами, хотя. Не уверен, где скрывается разрешение на связывание с ними, но я относительно уверен, что есть несколько слов ласки для них. Если посмотреть дальше, кажется, что функции, не являющиеся членами, более ограничены в соответствии с пунктом 3 [global.functions] 17.6.5.4:
Реализация не должна объявлять глобальную подпись или функцию, не являющуюся членом, с дополнительными аргументами по умолчанию.
Это будет означать, что вы Можно взять адрес функции, не являющейся членом, по крайней мере, при указании желаемой подписи.
Других решений пока нет …