C++ 在返回引用的函数上使用_declspec(nothrow)

C++ 在返回引用的函数上使用_declspec(nothrow),c++,visual-c++,declspec,C++,Visual C++,Declspec,我想对返回对象引用的一些成员函数应用\uu declspec(nothrow)。例如,我想将其添加到此函数(在MyClass.h中): 我需要在函数的返回类型之后添加它,如下所示: 返回类型\uuu declspec(nothrow)[调用约定]函数名([参数列表]) 如果我遵循这一点,我的大多数函数都可以与\uu declspec(nothrow)配合使用。但是,当我对上述成员函数(或任何其他返回CMyClass&的函数)执行此操作时,会出现编译错误: error C2059:语法错误:''d

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

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

返回类型\uuu declspec(nothrow)[调用约定]函数名([参数列表])

如果我遵循这一点,我的大多数函数都可以与
\uu declspec(nothrow)
配合使用。但是,当我对上述成员函数(或任何其他返回
CMyClass&
的函数)执行此操作时,会出现编译错误:

error C2059:语法错误:''declspec(nothrow)

我可以将它放在返回类型的前面,然后进行编译,但文档中还指出,如果将_declspec()放在错误的位置,编译器可能会忽略它,而不会发出警告或出现错误

使用
\u declspec(nothrow)
的正确方法是什么?

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

CMyClass __declspec(nothrow) & operator= ( IN UInt32 nValue )
编译器似乎遵循与简单声明相同的函数声明规则,
&
(或
*
)位于
declspec
之后。这符合一些标准

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

不过,正如其他人指出的那样,这有点浪费时间
throw()
没有相同的奇怪解析问题,并且特别声明它是等效的

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

#定义WINAPI u declspec(nothrow)u stdcall

void WINAPI f1()
void uu declspec(nothrow)uu stdcall f2()
void uu stdcall f3()抛出()


为什么不使用符合标准的
throw()
标记呢?这是一个毫无意义的练习。MSVC编译器允许nothrow声明,但它是将声明视为bs的一组实际编译器实现的一部分。他们在C++11中获得了更高的评价,异常规范被弃用。新关键字是noexcept。不用麻烦了。嗯,throw()和noexcept在VC++中都不起作用,而u declspec(nothrow)起作用。@Hans Passant:MSVC并没有完全忽略空的
throw()
说明符,它只是以非标准方式实现它。在MSVC中
throw()
允许编译器省略堆栈展开代码,这类似于
noexcept
。根据我的测试,
throw()
\u declspec(nothrow)
是相同的。谢谢你的回答,我会这样尝试。我看了文件,但我猜你引用的那部分不符合要求。我将查看是否为
throw()
\u declspec(nothrow)
获得等效的汇编程序输出。
CMyClass __declspec(nothrow) & operator= ( IN UInt32 nValue )