Как отключить предупреждение: смещение за пределы постоянной строки - PullRequest
0 голосов
/ 25 сентября 2019

Я использую 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 следует использовать.

...