enable_shared_from_this があんまり好きになれないにゃー

boost::enable_shared_from_this ,あるいは一般に,単純な参照もしくはポインタによってオブジェクトが与えられたとき,そのオブジェクトへの boost::shared_ptr (共有セマンティクスを持ったスマートポインタ) を得ることができるインタフェイスを提供するのがあんまり好きになれないにゃー,という話.
要するに,以下のコードのようなことが可能になるクラス C のインタフェイス getSharedPtr は,提供しなくて済むなら提供しないほうが,自分としてはうれしいんじゃにゃいかにゃー,という主張.

class C;

void f(C &c)
{
  boost::shared_ptr<C> pc = c.getSharedPtr();
  //...
}

好きになれないにゃー,だけでは自分の好みを主張しているだけなのでもうちょっとちゃんと rationale 述べると,こういうインタフェイスを提供すると,ある関数の実装内でオブジェクト c の所有権の共有が生じうることが,その関数のシグネチャに陽に現れなくなる場面が出てくるのでそれがいやだにゃー,というもの.具体的に上のコードでいえば,関数 f の実装で c の所有権の共有が生じているけれど,そのことが f のシグネチャに陽に表明されていない. getSharedPtr に類するインタフェイスが C に存在しないならば, f の実装内で所有権の共有を行うためには f のシグネチャが void f(boost::shared_ptr pc) にならざるを得ず,これによってシグネチャに所有権の共有が生じうることが表明される.
自分としては,所有権に関する semantics は C++ において型と同程度に重要な情報だと考えているので,関数のシグネチャに型に関する情報が表明されるならば,当然所有権に関する semantics も関数のシグネチャに表明されるべきだろうと思うのだ.のだはんしん.
これに対する1つの反論としては, getSharedPtr のようなインタフェイスを持つクラス C については,そのオブジェクトが現れるところでは常に所有権の共有が起こりうるものとしてコンセンサスを統一してしまえばよい,というのはあると思う.けれど,あるクラスのオブジェクトの所有権の共有が必要になる場面というのは,オブジェクトが使われる場面全般と比較して一般にかなり少なくなるだろうから,「オブジェクトが現れるところでは常に所有権の共有が起こりうる」というのはかなりオーバーな仕様になる嫌いがあるのではないかと思う.また,真に所有権の共有が頻出するのなら,明らかに何らかの側面で (っていうか少なくとも所有権の管理という側面で) 非常に高い凝集度が存在すると考えられるから,そのような場面では所有権の管理をもう一段メタな側面に凝集して,オブジェクトを使う場面では所有権云々を気にするような状態から解放してしまう (んで getSharedPtr なインタフェイスも排除してしまう) ほうがええんじゃないかねー,っていう.
こういう考えから boost::enable_shared_from_this やそれに属する技法はあんまり好きになれないにゃー,って思うんですけれど,なんか最後のほう主張が抽象的になりすぎてあんまり説得力無いのでやっぱいーや.