Я задал здесь вопрос о том, вызывает ли получение адреса функции компиляцию указанной функции конкретно в отношении замены -Отказ-это-не-ошибка. Самый прямой ответ на этот вопрос можно найти здесь:
Неформально объект используется odr, если его адрес взят или к нему привязана ссылка, а функция используется odr, если к ней сделан вызов функции или взят ее адрес. Если объект или функция используются odr, их определение должно существовать где-то в программе; нарушение этого является ошибкой времени компоновки.
Но все компиляторы, которые я тестировал, показывают, что это вполне выполнимо:
void foo(int);
auto bar = &foo;
Это не законно что ли? А если нет, то зачем он строится?
bar
, и вы должны получить сообщение об ошибке. Как правило, компиляторы не идут дальше, чем требует стандарт, и выдают ошибку только потому, что могут. Обычно они молча компилируют ваш код, а затем тонко взламывают его после того, как все тесты пройдены и пришло время выпуска. - person Revolver_Ocelot   schedule 18.07.2016