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
Ответить

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

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

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

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

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