constexprnie oznacza inlinezmiennych niestatycznych (zmienne wbudowane w C ++ 17)
Chociaż constexprsugeruje to inlinedla funkcji, nie ma tego efektu w przypadku zmiennych niestatycznych, biorąc pod uwagę zmienne wbudowane w C ++ 17.
Na przykład, jeśli weźmiesz minimalny przykład, który opublikowałem pod adresem: Jak działają zmienne wbudowane? i usuń inline, pozostawiając po prostu constexpr, wtedy zmienna otrzymuje wiele adresów, co jest główną rzeczą, której zmienne wbudowane unikają.
constexpr zmienne statyczne są jednak niejawnie statyczne.
Minimalny przykład, który constexprsugeruje inlinedla funkcji
Jak wspomniano na: https://stackoverflow.com/a/14391320/895245, głównym efektem inlinenie jest wstawianie, ale dopuszczenie wielu definicji funkcji, standardowy cytat pod adresem: W jaki sposób plik nagłówkowy C ++ może zawierać implementację?
Możemy to zaobserwować, grając na poniższym przykładzie:
main.cpp
#include <cassert>
#include "notmain.hpp"
int main() {
assert(shared_func() == notmain_func());
}
notmain.hpp
#ifndef NOTMAIN_HPP
#define NOTMAIN_HPP
inline int shared_func() { return 42; }
int notmain_func();
#endif
notmain.cpp
#include "notmain.hpp"
int notmain_func() {
return shared_func();
}
Skompiluj i uruchom:
g++ -c -ggdb3 -O0 -Wall -Wextra -std=c++11 -pedantic-errors -o 'notmain.o' 'notmain.cpp'
g++ -c -ggdb3 -O0 -Wall -Wextra -std=c++11 -pedantic-errors -o 'main.o' 'main.cpp'
g++ -ggdb3 -O0 -Wall -Wextra -std=c++11 -pedantic-errors -o 'main.out' notmain.o main.o
./main.out
Jeśli usuniemy inlinez shared_func, link nie zadziała z:
multiple definition of `shared_func()'
ponieważ nagłówek jest dołączany do wielu .cppplików.
Ale jeśli zastąpimy inlinego constexpr, to znowu działa, ponieważ constexprrównież implikuje inline.
GCC implementuje to, oznaczając symbole jako słabe w plikach obiektowych ELF: W jaki sposób plik nagłówkowy C ++ może zawierać implementację?
Przetestowano w GCC 8.3.0.
inlinerobi specyfikator. (A może źle zrozumiałem twoje sformułowanie.)