Если у нас есть файл заголовка widget.hpp
со следующим содержанием:
constexpr int foo = 10;
struct widget
{
int bars[foo];
};
... и у нас есть две единицы перевода, созданные из двух исходных файлов, оба из которых включают только widget.hpp
, нарушает ли это одно правило определения (точнее, нарушает ли использование foo
одно правило определения)?
foo
имеет внутреннюю связь, но это также постоянное выражение. Судя по тому, что я прочитал 3.2.6 в стандарте C ++ 11, который я процитирую ниже, это хорошо сформировано, если требование № 2 не относится исключительно к статическим элементам данных.
3.2.6 требование №2:
в каждом определении D соответствующие имена, найденные в соответствии с 3.4, должны относиться к объекту, определенному в определении D, или должны относиться к тому же объекту после разрешения перегрузки (13.3) и после сопоставления частичной специализации шаблона (14.8 .3), за исключением того, что имя может относиться к энергонезависимому константному объекту с внутренней связью или без нее, если объект имеет один и тот же буквальный тип во всех определениях D, и объект инициализируется константным выражением (5.19 ), и объект не используется odr, и объект имеет одно и то же значение во всех определениях D