Использование __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 ();

Другие вопросы по тегам