Может ли функция extern "C"
принимать или возвращать типы данных, специфичные для С++, такие как ссылки, указатели-к-членам или не-POD-классы (по значению)? Я не могу найти ничего в стандарте С++, который запрещает это. Логично, я бы ожидал, что стандарт скажет что-то об этом, так как C ABI не обязательно подходит для передачи таких типов.
Причина, по которой я хочу использовать C-ссылку, не имеет ничего общего с компиляторами C. Функция вызывается только из кода С++. Я просто хочу экспортировать unmangled имена функций из моих динамических библиотек.
Пример глупого кода:
class Foo {
public:
virtual void doit() = 0;
};
class Bar : public Foo {
public:
void doit() { std::cout << "Bar" << std::endl; }
};
extern "C" Foo& getFoo() { static Bar bar; return bar; }
extern "C" Bar getBar() { return Bar(); }
Это компиляция с GCC на Linux и работает так, как ожидалось. Должен ли он, стандартно?
Вопрос - это продолжение обсуждения в комментариях к этому вопросу.
Обновление Я тестировал это с компилятором Comeau, он не жаловался.