Законно ли объявлять шаблон функции типа, который имеет связь с языком C?C++

Программы на C++. Форум разработчиков
Anonymous
Законно ли объявлять шаблон функции типа, который имеет связь с языком C?

Сообщение Anonymous »

Шаблоны функций не могут иметь связь с языком C:

Код: Выделить всё

extern "C" {
template   // error: template with C linkage
void bad_f() {}
}
Это разумно, поскольку потенциально существует несколько экземпляров, но без изменения имени только один символ может быть экспортирован на двоичном уровне.
Однако и GCC, и Clang принимают шаблоны функций с нешаблонным типом языковой связи C:

Код: Выделить всё

extern "C" {
using F = void();
}

template
F f;

template
void f() {}
Меня это удивляет. Кажется разумным предположить, что, аналогично случаю без шаблона, экземпляры f имеют имена с языковой связью C++ (т. е. происходит искажение имен) и типы с C языковой связью (т. е. для их вызова используется соглашение о вызовах C).
Является ли объявление f действительно правильно сформированным C++? Если да, то делает ли он то, что я предполагаю?

Подробнее здесь: https://stackoverflow.com/questions/798 ... ge-linkage

Вернуться в «C++»