cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
90 stars 0 forks source link

Для static inline статических членов класса слово inline лишнее. #408

Open apolukhin opened 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +1, -3 Автор идеи: Vyacheslav Meshkov

class A {
    static const int ivar = 0;
    static const inline std::string = "text";
...
};

Заменить на:

class A {
    static const int ivar = 0;
    static const std::string = "text";
...
};
apolukhin commented 3 years ago

Andrey Davydov, 19 февраля 2019, 10:54 Во-первых, для типов с нетривиальными конструкторами важно, в какой момент они исполнятся, сейчас у пользователя есть возможность повлиять на это, а с Вашим предложением -- не будет.

Во-вторых, если принять такое правило, то весь старый код, где у static полей уже был definition, начнет нарушать ODR, не так ли?

Vyacheslav Meshkov, 25 февраля 2019, 20:03 Andrey Davydov, Мне тут сложно знать тонкости, потому что я не компиляторщик, и деталей не знаю. Могу лишь предположить, что вроде как сейчас оба варианта ниже уже допустимы, и проблем ODR не вызывают, верно?

1:

class A {

static int a = 10;

};

2:

class A {

static int a;

};

int A::a = 10;

Andrey Davydov, 25 февраля 2019, 21:50 Vyacheslav Meshkov, ну коли Вы не компиляторщик, так проверили бы компиляторами: https://gcc.godbolt.org/z/7J_20F. non-const static data member нельзя инициализировать inplace.

Vyacheslav Meshkov, 25 февраля 2019, 22:46 Andrey Davydov, Тут возникло недопонимание ввиду того, что я допустил ошибку, в отличие от первого поста. Имелось ввиду static const int. А теперь также можете проверить на godbolt.org.