Должно ли получение адреса шаблонной функции инициировать ее компиляцию?

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

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

template <typename T>
void foo(T&& x) { x.func(); }

int main()
{
auto bar = &foo<int>;
}

Все протестированные мной компиляторы завершаются с ошибкой вроде:

Запрос участника func в x, который имеет неклассный тип int

Но если я просто определю foo и не объявляйте это, код компилируется нормально. Может ли кто-нибудь предоставить мне официальный источник информации о том, что для получения адреса функции требуется ее компиляция?

7

Решение

3.2 / 2:

Выражение потенциально оценивается, если оно не является неоцененным
операнд (пункт 5) или его подвыражение. … не перегруженный
функция, имя которой появляется в качестве потенциально оцененного выражения или
член набора функций-кандидатов, если выбран перегрузкой
разрешение при обращении из потенциально оцененного выражения,
используется odr, если это не чисто виртуальная функция и ее имя не
явно квалифицировано.

Тогда 3.2 / 3:

Каждая программа должна содержать ровно одно определение каждого не встроенного
функция или переменная, которая используется в этой программе; нет диагностики
требуется. Определение может явным образом появиться в программе, оно может
найти в стандартной или пользовательской библиотеке, или (когда
уместно) оно неявно определено (см. 12.1, 12.4 и
12,8). Встроенная функция должна быть определена в каждой единице перевода, в которой она используется odr.

Имя функции определенно не является неоцененным операндом (например, для sizeof, decltype), И это появляется в выражении, поэтому оно потенциально оценивается. Тогда для второго требуется ровно одно не встроенное определение или идентичные встроенные определения в каждой единице перевода.

2

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

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