5

私は、gcc 4.5.3 を使用している 2 人のエンド ユーザーと、gcc 4.6.3 に移動したばかりの 2 人のエンド ユーザーがいるライブラリに取り組んでいます。このライブラリは、新しい C++11 スマート ポインター (特に unique_ptr) を使用し、gcc 4.5.3 で正常にコンパイルされます。ただし、これらの 2 つのバージョンの間で、gcc は nullptr のサポートを開始したため、unique_ptr の API が変更され、標準により厳密に一致するようになりました。そうすることで、次のコードは問題ありませんでした。

unique_ptr up( new int( 30 ) );
...
if( up == 0 ) // ambiguous call now to unique_ptr(int) for 0

nullptr の有無にかかわらず動作するように、上記の if ステートメントを変更するクリーンな (つまり、次の文の) 方法はありますか? 可能であれば、構成チェックを避けてから、次のようなマクロ(これでうまくいくと思います)を避けたいと思います

#if defined NULLPOINTER_AVAILABLE
  #define NULLPTR (nullptr)
#else
  #define NULLPTR (0)
#endif

または、これが私が探している動作を取得する唯一の方法ですか?

4

1 に答える 1

3

どのようなエラーが発生しましたか?

#include <iostream>
#include <memory>
int main() {
 using namespace std;
 unique_ptr<int> up( new int( 30 ) );
 if (up == 0)
     cout << "nullptr!\n";
 else cout << "bam!\n";
}

with g++ -std=c++0x -Wall nullptr.cpp -o nullptr(gcc 4.6.2)で正常にコンパイルされます。

また、StroustrupとSutterによるN2431nullptrの論文を読んで、同様の使用法(との比較0)が例の1つに明示的にリストされているところを確認してください。

于 2012-06-02T17:17:24.437 に答える