Я использую GCC 7.4.0, и в какой-то момент он начал выдавать мне следующее предупреждение:
смещение за пределы постоянной строки
Причина в том, чтокод теперь шаблонный и встроенный, и теперь компилятор может выполнить некоторые дополнительные проверки времени компиляции.Код выглядит примерно так:
template <typename StringType = std::string>
class StringWrapper {
public:
explicit StringWrapper(const typename StringType::value_type* string_buffer);
private:
static bool check(const typename StringType::value_type* string_buffer);
private:
StringType m_text;
};
template <typename StringType>
StringWrapper<StringType>::StringWrapper(
const typename StringType::value_type* string_buffer)
: m_text(check(string_buffer) ? string_buffer + 3U
: StringType{}) // the warning is at this line
{
}
template <typename StringType>
bool StringWrapper<StringType>::check(const typename StringType::value_type* string_buffer)
{
if (string_buffer == nullptr) {
return false;
}
return std::none_of(string_buffer, string_buffer + 3U,
[](const typename StringType::value_type& string_element) {
return string_element == '\0';
});
}
int main()
{
StringWrapper<> a("na");
return 0;
}
Компилятор, похоже, не может понять во время компиляции, что функция check()
уже проверила корректность смещения для применения без какого-либо риска.Причина, по которой компилятор в основном игнорирует вызов check()
, заключается в том, что функция, к сожалению, не может быть выполнена constexpr
, и, следовательно, ее нельзя оценить во время компиляции.
Как отключить только это конкретное предупреждение итолько для этой конкретной части кода?
Я нашел Как отключить предупреждения GCC для нескольких строк кода , но я не знаю, какой -Wname_of_warning
следует использовать.