Законно ли объявлять шаблон функции типа, который имеет связь с языком 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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