меня сейчас он выполняется идентично как с инлайн. в чем тонкость?
тонкость в том что inline уже другое делает
С inline у тебя могла бы быть отдельная такая переменная в каждой единице трансляции. Если это тебе нужно, то вперёд.
Вообще, призываю не использовать тебе средства языка, которые ты не понимаешь. Надо тебе что-то - изучи, пойми, используй. Не понимаешь - не используй
Разве? Или инлайн для стариков внутри класса как-то по-другому работает в отличии от других контекстов?
Да не будет один счётчик на все единицы трансляции
Вот что говорит cppref: An inline function or variable (since C++17) with external linkage (e.g. not declared static) has the following additional properties: It has the same address in every translation unit. Inline variables eliminate the main obstacle to packaging C++ code as header-only libraries. Там даже есть пример использования неконстантоной инлайн переменной в двух TU, но пример показался мне не очень показательным
А для чего тогда extern?
The inline specifier, when used in a decl-specifier-seq of a variable with static storage duration (static class member or namespace-scope variable), declares the variable to be an inline variable. Ну даже на цппрефе написано про Статик мемберы
Я крайне редко вижу его в коде
Говорится что инлайн переменная во всех транзишн юнитах имеет один адрес. А разве экстерн делает не тоже самое?
Экстерн делает объявление и не определяет переменную
Не совсем понимаю, к чему этот отрывок. На cppref чётко разделяют значения static: When used in a declaration of a class member, it declares a static member. When used in a declaration of an object, it specifies static storage duration Наша инлайн переменная не объявлена со static storage duration, она объявлена как static member (см. ниже, нам не важен storage duration, нам важен internal/external linkage)
А какой тогда у нее стораж дурэйшн?
Тут, я, конечно, некорректно сделал акцент и выразился: Static members of a class are not associated with the objects of the class: they are independent variables with static or thread (since C++11) storage duration or regular functions Но: Static data members of a class in namespace scope have external linkage if the class itself has external linkage (is not a member of unnamed namespace)
Ну вроде линкаж и стораж дурайшн раздельные вещи)
Да, поэтому я и указал, что неправильно акценты расставил. Просто исходя из того, о чём писал @MasterZiv, он, похоже, подразумевал, что static inline переменная класса имеет internal linkage
Ну может быть. Я написал просто, что на цппрефе написано в скобках Статик мемберы класса и нэймспейс переменные и то, что они с инлайном становятся инлайн переменными.
Странно было бы если б было иначе
Ну инлайн переменные имеют экстернал линкаж
Но ведь они имеют external linkage
Если я всё верно понимаю и у меня нет дыры в понимании спецификаторов и квалификаторов в C++... То у вас всё правильно в этом плане — использовать статические инлайн переменные класса с инициализатором прямо в определении класса можно, они для этого и были добавлены в C++17
Можно, я не говорил, что нельзя
Обсуждают сегодня