Пример ниже работает так, как задумано, с gcc 14.2 и msvc v19.40, но clang 19 выдает непредвиденную ошибку в помеченной строке. (2). Поэтому я хотел бы спросить языковых юристов: хорошо ли сформулирован приведенный ниже пример и должен ли он быть принят также и clang.
Код (ссылка на godbolt) :
Код: Выделить всё
// Goal of this study:
// - allow access to `Data` via public namespace lib::api.
// - forbid access to `Data` via private namespace lib::impl_v1.
namespace lib::impl_v1 {
template
struct Data;
} // namespace lib::impl_v1
namespace lib::api {
using impl_v1::Data;
} // namespace lib::api
namespace lib::impl_v1 {
inline namespace please_access_this_symbol_through_lib_api_namespace {
template struct Data; // (1)
} // inline namespace please_access_this_symbol_through_lib_api_namespace
} // namespace lib::impl_v1
namespace lib::impl_v1 {
template
struct Data
{
};
} // namespace lib::impl_v1
int main()
{
lib::api::Data x; // (2) clang error: implicit instantiation of undefined template 'lib::impl_v1::Data'
// lib::impl_v1::Data y; // (3) The goal is to get error at this line: reference to 'Data' is ambiguous
return 0;
}
Ошибка в строке (3) намеренно.
Подробнее здесь: https://stackoverflow.com/questions/790 ... ing-declar