constexpr
не подразумевает inline
для нестатических переменных (встроенные переменные C ++ 17)
Хотя constexpr
это и подразумевается inline
для функций, он не имеет такого эффекта для нестатических переменных, учитывая встроенные переменные C ++ 17.
Например, возьмем минимальный пример, который я разместил по адресу: Как работают встроенные переменные? и удалите inline
, оставив только constexpr
, тогда переменная получит несколько адресов, чего в основном избегают встроенные переменные.
constexpr
однако статические переменные неявно статичны.
Минимальный пример, который constexpr
подразумевает inline
для функций
Как упоминалось по адресу: https://stackoverflow.com/a/14391320/895245, основной эффект inline
заключается не во встроении, а в разрешении нескольких определений функции, стандартная цитата по адресу: Как файл заголовка C ++ может включать реализацию?
Мы можем убедиться в этом, поиграв со следующим примером:
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();
}
Скомпилируйте и запустите:
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
Если мы удалим inline
из shared_func
, ссылка не удастся:
multiple definition of `shared_func()'
потому что заголовок включается в несколько .cpp
файлов.
Но если мы заменим inline
на constexpr
, то он снова работает, потому что constexpr
также подразумевает inline
.
GCC реализует это, помечая символы как слабые в объектных файлах ELF: Каким образом файл заголовка C ++ может включать реализацию?
Протестировано в GCC 8.3.0.
inline
делает спецификатор. (Или, может быть, я неправильно понял вашу формулировку.)