Инициализация членов класса GTest const - PullRequest
0 голосов
/ 13 сентября 2018

Я хочу добиться чего-то вроде этого:

class MyTest: public ::testing::Test {
public:
   const int myConstInt     = 23;
}

TEST_F(MyTest, MyTest1) {... use myConstInt ...}

Но, если вспомнить пункт 4 EffectiveCPP, инициализация не гарантируется таким образом, и существует вероятность неопределенного поведения.

Допустим, вышеприведенный Метод 1 .

Я могу придумать два других метода для достижения этой цели:

Метод 2 : список инициализаторов myConstStr с использованием конструктора MyTest.

Метод 3 : сделать это constexpr - поскольку значение устанавливается во время компиляции, я не должен сталкиваться с какими-либо проблемами инициализации во время выполнения.

Каким будет правильный путь? Также «Эффективный CPP» - это относительно старая книга. Применимо ли обсуждение пункта 4 в полной мере?

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018
   const int myConstInt     = 23;

является нестатическим элементом данных с инициализатором элемента по умолчанию https://en.cppreference.com/w/cpp/language/data_members#Member_initialization

Нет абсолютно никакого риска, что это неопределенное поведение.

Инициализация гарантирована

0 голосов
/ 13 сентября 2018

После обсуждения Cpplang slack выяснилось, что лучшим решением было бы использовать static const для любых целочисленных / перечислимых типов - также можно использовать static constexpr, но это, по сути, то же самое, за исключением C ++ 17, где static Элементы данных constexpr также могут быть встроенными.

Полезная ссылка Ссылка: constexpr против статического const: Какой предпочитать?

...