Поделиться через


Ошибка компилятора C2338

Сообщение об ошибке

Замечания

Ошибка C2338 может быть вызвана ошибкой static_assert во время компиляции. Сообщение предоставляется параметрами static_assert .

Ошибка C2338 также может быть создана внешними поставщиками компилятора. В большинстве случаев эти ошибки сообщаются библиотекой DLL поставщика атрибутов, например ATLPROV. Ниже приведены некоторые распространенные формы этого сообщения:

  • Поставщик атрибутов Atl Atl: сообщение об номереATLошибки

  • Неправильное использование атрибута "атрибут"

  • "использование": неправильный формат атрибута "использование"

Эти ошибки часто не возвращаются и могут следовать за неустранимой ошибкой компилятора.

Чтобы устранить эти проблемы, исправьте использование атрибутов. Например, в некоторых случаях параметры атрибута должны быть объявлены до их использования. Если указан номер ошибки ATL, ознакомьтесь с документацией по этой ошибке для получения дополнительных сведений.

Example

В C++11 и более поздних constexpr версиях функции больше не рассматриваются noexcept по умолчанию при использовании в константном выражении. Это изменение поведения происходит из разрешения основной рабочей группы (CWG) CWG 1351 и включено в /permissive- режиме. Следующий пример компилируется в Visual Studio 2019 версии 16.1 и более ранних версиях, но вызывает C2338 в Visual Studio 2019 версии 16.2:

// c2338.cpp
// Compile using: cl /EHsc /W4 /permissive- c2338.cpp
constexpr int f() { return 0; }

int main() {
    static_assert(noexcept(f()), "f should be noexcept"); // C2338 in 16.2
}

Чтобы устранить эту ошибку, добавьте выражение noexcept в объявление функции:

// c2338_fixed.cpp
// Compile using: cl /EHsc /W4 /permissive- c2338_fixed.cpp
constexpr int f() noexcept { return 0; }

int main() {
    static_assert(noexcept(f()), "f should be noexcept");
}