[dcl.constexpr]/9
specyfikator constexpr wykorzystane w deklaracji obiektu deklaruje obiekt jako const.
[basic.link]/3.2
Nazwa mający zakres namespace ma wewnętrzny łącznik jeśli jest to nazwa
-a non-inline zmienna nielotnych const wykwalifikowanej typ, który nie jest jawnie zadeklarowanym zewnętrznym, ani nie został zadeklarowany wcześniej jako zewnętrzny łącznik
Bez specyfikatora inline
, miałby wewnętrzny link. Może to być problematyczne, jeśli porównasz dwa wskaźniki do tej samej nazwy zmiennej w innej jednostce tłumaczeniowej.
Nota Bene: wbudowany specyfikator jest nadmiarowy z constexpr tylko wtedy, gdy zmienna jest statycznym elementem danych klasy.
następstwie exemple łatwego naruszeniem one definition rule że może się zdarzyć, jeśli is_integral_v
gdzie nie inline.
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.
}
W dwóch jednostkach tłumaczeniowych zmienna bad_is_integral_v
jest tworzona jako oddzielne zmienne statyczne. Funkcja inline g()
jest zdefiniowana w tych dwóch jednostkach tłumaczeniowych.Wewnątrz definicji g()
zmienna bad_is_integral_v
wykorzystuje ODR, więc dwie definicje g()
są różne, co stanowi naruszenie zasady jednej definicji.
https://stackoverflow.com/a/38043566/2466431 – JVApen
Zrobiliśmy dokładnie jeden "inline" w naszej dokumentacji szablonów zmiennych cech typu. 'is_integral_v' nie jest tym. –