Использование __declspec(nothrow) в функциях, которые возвращают ссылки
Я хотел бы подать заявку __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 ответ
Я считаю (но не уверен на 100%) правильный синтаксис:
CMyClass __declspec(nothrow) & operator= ( IN UInt32 nValue )
Кажется, что компилятор следует тому же правилу для объявлений функций, что и для простых объявлений, и &
(или же *
) идет после declspec
, Это соответствует некоторой документации MSDN.
Ключевые слова __declspec должны быть помещены в начале простого объявления. Компилятор без предупреждения игнорирует любые ключевые слова __declspec, помещенные после * или & и перед идентификатором переменной в объявлении.
Однако, как отмечали другие, это пустая трата времени. throw()
не имеет таких же странных проблем с разбором, и в документации конкретно указано, что это эквивалентно.
Учитывая следующую директиву препроцессора, три объявления функций ниже эквивалентны:
#define WINAPI __declspec (nothrow) __stdcall
void WINAPI f1 ();
void __declspec (nothrow) __stdcall f2 ();
void __stdcall f3 () throw ();