ODR и пространства имен/область действияC++

Программы на C++. Форум разработчиков
Anonymous
ODR и пространства имен/область действия

Сообщение Anonymous »

Правило одного определения в стандарте C++20 гласит, что в программе не может быть двух определений типа класса, если только эти два определения не находятся в разных единицах трансляции и не имеют одинаковой последовательности токенов (§6.3/§13.8) (плюс некоторые другие требования). В требовании не упоминается область действия или связь.
По номиналу это исключает такой код, если a.cpp, b.cpp и c.cpp были частью одной и той же программы:
a.cpp

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

class T{};
b.cpp

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

namespace N { class T{int i;}; }
c.cpp

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

void f() { class T{float f;}; }
Я совершенно уверен, что пример хорош; как я мог оправдать это стандартом? Я знаю, что «объявление имени во вложенной декларативной области скрывает объявление того же имени во включающей
декларативной области» (§6.4.10); но видимость здесь не проблема: имя T из a.cpp не отображается в b.cpp или c.cpp.


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

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