Использование __declspec (nothrow) для функций, которые возвращают ссылки - PullRequest
2 голосов
/ 07 февраля 2012

Я хотел бы применить __declspec(nothrow) к некоторым из моих функций-членов, которые возвращают ссылки на объекты. Например, я хотел бы добавить его в эту функцию (в MyClass.h):

CMyClass& operator= ( IN UInt32 nValue )
{
    return ( SetValue ( nValue ) );
};

Документация VC ++ гласит , что мне нужно добавить ее после типа возврата функции, например:

return-type __declspec(nothrow) [call-convention] function-name ([argument-list])

Если я последую этому, большинство моих функций работают нормально с __declspec(nothrow). Однако, когда я делаю это для вышеуказанной функции-члена (или любой другой, которая возвращает CMyClass&), я получаю ошибки компиляции:

error C2059: syntax error : '__declspec(nothrow)'

Я могу поставить его перед возвращаемым типом, и тогда он будет скомпилирован, но в документации также сказано, что если __declspec () находится в неправильном месте, компилятор может игнорировать его без предупреждения или ошибки.

Как правильно использовать __declspec(nothrow)?

1 Ответ

3 голосов
/ 10 февраля 2012

Я считаю (но не уверен на 100%) правильный синтаксис:

CMyClass __declspec(nothrow) & operator= ( IN UInt32 nValue )

Кажется, что компилятор следует тому же правилу для объявлений функций, что и для простых объявлений, и & (или *) идет после declspec.Это соответствует части документации MSDN .

Ключевые слова __declspec должны быть помещены в начале простого объявления.Компилятор без предупреждения игнорирует любые ключевые слова __declspec, помещенные после * или & и перед идентификатором переменной в объявлении.

Как уже отмечали другие, это является пустой тратойвремя.throw() не имеет таких же нечетных проблем с синтаксическим анализом, и документация специально указывает, что это эквивалентно.

Учитывая следующую директиву препроцессора, три объявления функции нижеэквивалент:

# определить WINAPI __declspec (nothrow) __stdcall

void WINAPI f1 ();
void __declspec (nothrow) __stdcall f2 ();
void __stdcall f3() throw ();

...