12

GCC4.7では次のコンパイルが正常に行われることに気付きました。

#include <memory>

int main() {
    std::shared_ptr<int> p;
    p = 0;
}

ただし、からintまたはからの代入演算子はなく、どちらかまたはどちらint*からも暗黙のコンストラクターはありません。からのコンストラクターがありますが、それは明示的です。私は標準ライブラリの実装を確認しましたが、コンストラクターは確かに明示的であり、怪しげな代入演算子は見えません。intint*int*

プログラムは実際に整形式ですか、それともGCCが私をいじっていますか?

4

2 に答える 2

16

これが機能する理由は、標準からのこの短い引用です。

§4.10 [conv.ptr] p1

ヌルポインタ定数は、整数型の整数型の整数型のprvalue(5.19)であり、ゼロまたは型のprvalueに評価されますstd::nullptr_t。[...]整数型のnullポインタ定数は、型のprvalueに変換できますstd::nullptr_t。[...]

std::shared_ptrそして、からの暗黙のコンストラクターがあるという事実std::nullptr_t

§20.7.2.2 [util.smartptr.shared] p1

constexpr shared_ptr(nullptr_t) : shared_ptr() { }

これにより、次のような奇妙なことも可能になります。

#include <memory>

void f(std::shared_ptr<int>){}

int main(){
  f(42 - 42);
}

実例。

于 2012-08-09T17:19:39.737 に答える
0

共有ポインタは、共有ポインタの別のインスタンスにのみ割り当てることができます。shared_pointerが保持するタイプを割り当てることはできません。Afaikこれはオペレーターにとって唯一の過負荷です:

shared_ptr& operator=(const shared_ptr& r);

あなたがしているのは、型の値ではなく、ポインタに0(この場合はNULLに等しい)を割り当てることです。コードのこの時点では、入力すら初期化されていません。

于 2012-08-09T17:20:19.317 に答える