[dcl.constexpr]/9
A constexpr Spezifizierer in einer Objektdeklaration erklärt das Objekt als const.
[basic.link]/3.2
Ein Name Namensraum Umfang aufweist, hat interne Bindung wenn es der Name
-a nicht inline Variable des nichtflüchtigen const qualifizierte ist Typ, der weder explizit extern deklariert ist noch zuvor für eine externe Verknüpfung deklariert wurde
Ohne inline
Spezifizierer, hätte is_integral_v
interne Verknüpfung. Dies könnte problematisch sein, wenn Sie zwei Zeiger mit demselben Variablennamen vergleichen, die in einer anderen Übersetzungseinheit enthalten sind.
ANMERKUNG: die Inline-Spezifizierer ist redundant mit constexpr nur dann, wenn die Variable eine Klasse statisches Datenelement ist.
ein exemple von leicht Verletzung der one definition rule Nach, dass, wenn is_integral_v
wo nicht inline passieren könnte.
bad_type_trait.h
template<class T>
constexpr auto bad_is_integral_v=std::is_integral<T>::value;
my_header.h
#include "bad_type_trait.h"
void f(const bool& x);
inline void g()
{
f(bad_is_integral_v<int>);
//g ODR use the static variable bad_is_integral_v.
//"ODR use" approximate definition is:
// the variable is refered by its memory address.
}
source1.cpp
#include "my_header.h"
void my_func1(){
g(); //the definition of g in this translation unit.
}
source2.cpp
#include "my_header.h"
void my_func2(){
g(); //is not the same as the definition of g in this translation unit.
}
In den beiden Übersetzungseinheiten wird die Variable bad_is_integral_v
als separate statische Variable instanziiert. Die Inline-Funktion g()
ist in diesen beiden Übersetzungseinheiten definiert.Innerhalb der Definition von g()
wird die Variable bad_is_integral_v
ODR verwendet, daher sind die beiden Definitionen g()
unterschiedlich, was eine Verletzung der Definitionsregel darstellt.
https://stackoverflow.com/a/38043566/2466431 – JVApen
Wir haben genau einen 'Inline'-Code in der Dokumentation unserer Typeigenschaftenattributvorlagen erstellt. 'is_integral_v' ist das nicht. –