Плюсы и минусы участников класса constexpr - PullRequest
0 голосов
/ 06 июня 2018

Сравните эти два подхода:

// MyClass.hpp
class MyClass
{
  static constexpr char* const FOO = "bar";
};

против

// MyClass.hpp
class MyClass
{
  static const char* const FOO;
};

// MyClass.cpp
const char* const MyClass::FOO = "bar";

Какой из них предпочтительнее?Я полагаю, что во втором случае строка "bar" выделяется только один раз, тогда как в первом случае она выделяется один раз для каждого .cpp, который включает мой заголовок.Я прав?Есть ли еще какие-то моменты, которые следует учитывать?

1 Ответ

0 голосов
/ 06 июня 2018

Первая версия возможна только с c++17.Это работает, потому что все статические переменные-члены, объявленные constexpr, неявно inline .

Допускается несколько определений (в отдельных единицах компиляции), но при связывании их будет только 1. Итак, вы предполагаете, чтоон распределяется один раз в каждом .cpp файле. Это неверно.

Какой из них предпочтительнее, может зависеть.Я бы выбрал первый вариант, если бы знал, что никогда не буду его менять, или очень редко.

Если мне потребуется изменить его, это может привести к тому, что все файлы .cpp, которые #include будут иметьперекомпилировать, и тогда было бы лучше выделить его в файл .cpp.

...