Основанием для встроенных пространств имен C++ является совместимость как исходного кода, так и бинарной совместимости (см. документ Херба Саттера, ссылка на который приведена в N2535), но мне не удалось найти хороших примеров сохранения двоичной совместимости для существующих библиотек при введении встроенных пространств имен или, если это возможно .
(дополнительную информацию и примеры совместимости источников см. в этом вопросе)
(для решения связанной проблемы с использованием встроенного пространства имен для введения несовместимости см. этот вопрос)
Если это наша текущая библиотека (например, mylib.dll), которая используется совместно с клиентами и должна быть стабильной:
struct ModelA
{
/* (...) lots of stuff */
};
struct ModelB
{
/* (...) lots of stuff */
};
Можем ли мы использовать встроенные пространства имен для введения новых версий структур/классов без нарушения работы клиентов (т. е. заменить только файл общей библиотеки (mylib.dll), без необходимости повторной компиляции)?
inline namespace mylib
{
inline namespace v1
{
struct ModelA
{
/* (...) lots of stuff */
};
} // end namespace v1
namespace v2
{
struct ModelA
{
/* (...) lots of stuff + newstuff */
};
} // end namespace v2
struct ModelB
{
/* (...) lots of stuff */
};
} // end namespace mylib
Если нет, будет ли он работать без объемлющего встроенного пространства имен mylib?