48

私はそれnullptrが Visual Studio 2010 で実装されているのを見ました。私はこのコンセプトが好きで、できるだけ早く使い始めたいと思っています。ただし、GCC はまだサポートしていません。私のコードは両方で実行する必要があります (ただし、他のコンパイラでコンパイルする必要はありません)。

それを「エミュレート」する方法はありますか?何かのようなもの:

#define nullptr NULL

(それは明らかにうまく機能しません。私の言いたいことを示すためです。)

4

5 に答える 5

63

公式提案には回避策があります-

const                        // this is a const object...
class {
public:
  template<class T>          // convertible to any type
    operator T*() const      // of null non-member
    { return 0; }            // pointer...
  template<class C, class T> // or any type of null
    operator T C::*() const  // member pointer...
    { return 0; }
private:
  void operator&() const;    // whose address can't be taken
} nullptr = {};              // and whose name is nullptr
于 2010-03-10T19:27:48.047 に答える
10

gccは4.6の時点でnullptrをサポートしているようです。

于 2010-11-17T05:10:34.107 に答える
6

また、gcc (実際には g++) には何年もの間、拡張子 __null がありました。これは、nullptr の提案が出されたときに、業界の実装経験としてカウントされました。

__null 拡張機能は、特殊なケースを検出し、NULL をポインター パラメーターに渡すことを意図していたときに、誤って bool パラメーターに渡すなどの警告を発することができます (関数に加えられた変更、呼び出し側を適応させるのを忘れた)。

もちろん、これは移植性がありません。上記のテンプレート ソリューションは移植可能です。

于 2011-06-30T19:06:55.433 に答える
5

gcc 4.6.1 (Ubuntu 11.11 oneiric) で見えるようになり、nullptr が追加されました。

私のhpp/cppファイルでの迅速な再帰的なsed検索と置換は、私にとってはうまくいきました:

find . -name "*.[hc]pp" | xargs sed -i 's/NULL/nullptr/g'
于 2011-12-01T07:27:32.853 に答える
1

-std=c++0x を忘れた可能性が高いです。私の gcc の Mingw バージョンは 4.6.1/4.7.1 で、どちらも nullptr をうまくサポートしています。

「C++ 標準ライブラリ チュートリアルとリファレンス 第2弾」の説明によると、nullptrがキーワードで、整数型ではなく各ポインタ型に自動変換できるため、次のオーバーロード関数とあいまいなNULLの欠点を克服しています。 : void f(int ); ボイド f(ボイド *);

f(ヌル); // あいまいな f(nullptr); // わかった

VC2010 でこの機能をテストすると、MSDN ドキュメントが実際のコンパイラと競合することが示されます。ドキュメントには次のように記載されています。

nullptr キーワードは型ではないため、次のものとの使用はサポートされていません。

のサイズ

typeid

nullptrを投げる

実際、VC2010 では、上記の演算子/式はすべて有効です。sizeof(nullptr) 結果 4. typeid.name() 結果 std::nullptr_t および throw nullptr は、"const void *" および "void *" (およびその他のポインター型) によってキャッチできます。

gcc(4.7.1) は nullptr についてより厳格に見えますが、スロー nullptr は「void *」でキャッチできず、「...」でキャッチできます。

于 2012-06-28T07:13:40.603 に答える