Как написать «вложенный оператор if ... else для констант» без предупреждений в стандарте gnu ++ 11? - PullRequest
4 голосов
/ 02 апреля 2019

Когда я использую вложенный оператор if .... else с

if (std::is_same<T, T1>::value) 
{
  // do something
} 
else if (std::is_same<T, T2>::value)
{
  // do something else
}
.
.
.
else
{
  // print error
}

Я получаю предупреждение компилятора статического анализатора кода QACPP qacpp-4.2.1-4090 с сообщением «Условие в этом операторе« если »является постоянным». Как исправить это предупреждение компилятора в стандартах gnu ++ 11?

ПРИМЕЧАНИЕ: я не эксперт в C ++, поэтому извините, если вопрос звучит как любитель.

Ответы [ 2 ]

3 голосов
/ 02 апреля 2019

Для конкретного экземпляра T условия if являются константой. Другими словами std::is_same<T, int>::value & c. константные выражения.

Но это вполне может быть необходимо, если вы изложили код совершенно законным способом. (Вы можете изменить метод статического полиморфизма, используя специализацию шаблонов, если важно избежать предупреждения статического анализатора.)

Похоже, что статический анализатор меня слишком усердствует.

2 голосов
/ 03 апреля 2019

Инструмент кодирования буквально просит вас отказаться от хороших практик, таких как:

if (static_condition) {
   // code that is effectively compiled out when static_condition is false
}

, и вместо этого использовать что-то вроде:

#if static_condition
   // code that is compiled out when static_condition is false
#endif

, что даже нельзя сделать точноСитуация, в которой вы находитесь, и является низшей практикой.

Это не очень хорошая, продуктивная диагностика, за исключением случаев, когда static_condition явно безоговорочно, как if (false) ....

ЕслиВ противном случае инструмент диагностики полезен, узнайте, как подавить эту диагностику в определенных файлах или строках кода.Возможно, он поддерживает какую-то директиву, которую можно поместить в комментарии, чтобы подавить некоторую диагностику.

// @foo-bar tool: disable-warning(13125)
if (static_condition) ...
...