在返回引用的函数上使用__declspec(nothrow)

时间:2012-02-06 22:41:26

标签: c++ visual-c++ declspec

我想在我的一些返回对象引用的成员函数上应用__declspec(nothrow)。例如,我想将它添加到此函数中(在MyClass.h中):

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

我需要在函数的返回类型之后添加VC++ documentation says,如下所示:

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

如果我遵循这一点,我的大多数功能都可以正常使用__declspec(nothrow)。但是,当我为上面的成员函数(或任何返回CMyClass&的其他函数)执行此操作时,我收到编译错误:

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

我可以把它放在返回类型的前面然后编译然后文档也说如果__declspec()放在错误的位置,编译器可能会忽略它而没有警告或错误。

使用__declspec(nothrow)的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

我相信(但不是100%肯定)正确的语法是:

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

编译器似乎遵循与简单声明相同的函数声明规则,而&(或*)遵循declspec。这与MSDN documentation中的一些匹配。

  

__declspec关键字应放在简单声明的开头。编译器在没有警告的情况下忽略在*或&之后放置的任何__declspec关键字。并且在声明中的变量标识符前面。

正如其他人所指出的那样,这是浪费时间。 throw()没有相同的奇怪解析问题,the documentation明确指出它是等效的。

  

给定以下预处理器指令,下面的三个函数声明是等效的:

     
    

#define WINAPI __declspec(nothrow)__ stdcall

         

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