Se abbiamo un file di intestazione widget.hpp
con i contenuti di seguito:constexpr e ODR
constexpr int foo = 10;
struct widget
{
int bars[foo];
};
... e abbiamo due unità di traduzione generati da due file di origine cui entrambi includono solo widget.hpp
, fa questo violare quella regola di definizione (in particolare, l'uso di foo
viola la regola di una definizione)?
foo
ha un collegamento interno ma è anche un'espressione costante. Dalla mia lettura del 3.2.6 nello standard C++ 11, che citerò di seguito, questo è ben formato se il requisito # 2 non si riferisce solo ai membri dei dati statici.
3.2.6 requisito # 2:
in ogni definizione di D, nomi corrispondenti, guardato secondo 3.4, si riferiscono a un'entità definita nella definizione di D o adotta fare riferimento alla stessa entità, dopo la risoluzione di sovraccarico (13.3) e dopo l'abbinamento della specializzazione modello parziale (14.8.3), eccetto che un nome può fare riferimento a un oggetto const non volatile con interno o nessun collegamento se l'oggetto ha lo stesso tipo letterale in tutte le definizioni di D, e l'oggetto viene inizializzato con un'espressione costante (5.19), e l'oggetto non è ODR utilizzato, e l'oggetto ha lo stesso valore in tutte le definizioni di D