Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
не может использоваться
__tryв функциях, требующих очистки объекта
Замечания
Ошибка C2712 может возникать при использовании /EHsc, а функция с структурированной обработкой исключений также содержит объекты, требующие очистки (уничтожения).
Возможные решения:
переместите код, для которого требуется SEH, в другую функцию;
заново напишите функции, использующие SEH, чтобы избежать использования локальных переменных и параметров с деструкторами; не используйте SEH в конструкторах и деструкторах;
компилируйте код без параметра /EHsc.
Ошибка C2712 также может возникать при вызове метода, объявленного с помощью ключевого __event слова. Так как событие может использоваться в многопоточной среде, компилятор создает код, который предотвращает обработку базового объекта события, а затем заключает созданный код в инструкциюtry-finally Поэтому ошибка C2712 может возникнуть, если вызвать метод события и передать аргумент, тип которого содержит деструктор. Одно из решений в данном случае — передача аргумента в качестве константной ссылки.
C2712 также может возникать при компиляции и /clr:pure объявлении статического массива указателей на функции в блоке __try . Для статического элемента компилятору требуется использовать динамическую инициализацию, /clr:pureкоторая подразумевает обработку исключений C++. Однако обработка исключений C++ не допускается в блоке __try.
/clr:pure Параметры /clr:safe компилятора устарели в Visual Studio 2015 и не поддерживаются в Visual Studio 2017.
Пример
В следующем примере создается C2712 и показано, как исправить его.
// C2712.cpp
// compile with: /clr:pure /c
struct S1 {
static int smf();
void fnc();
};
void S1::fnc() {
__try {
static int (*array_1[])() = {smf,}; // C2712
// OK
static int (*array_2[2])();
array_2[0] = smf;
}
__except(0) {}
}