この質問に答えたときに、この質問が出てきましたfriend。標準は、標準ライブラリのクラスや関数を -ingすることを許可し、保証しますか?
この特定のケースでは、問題は次のような状況でした。
class MyUserDefinedType
{
friend struct std::default_delete<MyUserDefinedType>;
private:
~MyUserDefinedType() { }
}
デフォルトのデリータでorオブジェクトMyUserDefinedTypeに格納できることが保証されています。std::unique_ptr<MyUserDefinedType>std::shared_ptr<MyUserDefinedType>
一般に、標準ライブラリに記述されているクラスは、その機能を直接実装する必要がありますか?それとも、任意のレベルの間接化を使用できますか? たとえば、それは可能ですか?
std::default_delete<MyUserDefinedType>は、実際にはusingの内部ネームスペースで定義されたクラスのエイリアスですstd。この場合、friend宣言は不正になります。
また
std::default_delete<MyUserDefinedType>実際に削除を行う他のクラスを呼び出します。この場合、friend宣言は目的の効果をもたらしません。
またはそれらの線に沿った何か?
私の推測では、これは動作が保証されていないUBですが、これが標準によって具体的に対処されているかどうかに興味があります。
上記の特定の例は、clang トランク (libc++ を使用) および GCC 4.7.2 (libstdc++ を使用)、FWIW で機能します。