2012-02-06 23 views
2

オブジェクト参照を返すメンバ関数の一部に__declspec(nothrow)を適用したいと思います。例えば、私は(MyClass.hで)この機能に追加したいと思います:参照を返す関数で__declspec(nothrow)を使用する

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

なぜ標準に準拠した 'throw()'マーキングを使用しないのですか? –

+2

これはかなり意味のない練習です。 MSVCコンパイラは* nothrow *宣言を許可しますが、宣言をbsとして扱うReal Compiler実装のグループの一部です。彼らはC++ 11でより多くのクレジットを獲得しましたが、例外仕様は廃止されました。新しいキーワードは* noexcept *です。気にしないでください。 –

+1

__declspec(nothrow)はそうですが、VC++ではthrow()もnoexceptも動作しません。 – xxbbcc

答えて

3

私は信じている(しかし、100%確かではないよ)正しい構文は次のとおりです。

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

単純な宣言の場合と同様に、コンパイラは、関数宣言のための同じ規則に従っているようだ、と&(または*)はdeclspecの後に続きます。これはMSDN documentationの一部と一致します。

__declspecキーワードは、単純な宣言の先頭に配置する必要があります。コンパイラは、*または&の後に宣言の変数識別子の前に置かれた__declspecキーワードを警告なしで無視します。

他の人が指摘しているように、これは時間の無駄です。 throw()には、同じ奇数解析問題はなく、the documentationは、それが同等であると具体的に述べています。

は、次のプリプロセッサディレクティブを考えると、3つの関数の宣言は、以下と等価です:

の#define WINAPIの__declspec(nothrow)__stdcall

無効WINAPIのF1();
void __declspec(nothrow)__stdcall f2();
void __stdcall f3()throw();

+0

答えをありがとう、私はこのように試してみます。私はドキュメントを読んだが、あなたが引用した部分は固執しなかったと思う。 'throw()'と '_declspec(nothrow)'の同等のアセンブラ出力が得られるかどうかを確認します。 – xxbbcc

関連する問題