constructとdestroy

constructdestroyって標準C++にもあるものだとばかり思い込んでいた.constructはplacement newで良いし,destroyは上のようにscalar/non-scalarの区別無く明示的デストラクタ呼び出しで良いから無いのね.
ちなみに,SGISTLではiteratorの範囲を取るdestroyのバージョンがあって

template<class ForwardIterator>
void destroy(ForwardIterator first, ForwardIterator last);

これはシグネチャ見れば予想できるように,[first, last)に対して各々明示的デストラクタ呼び出しする関数ですけれど,これも標準C++にはない.これは下のように明示的にfor文回せってことなんでしょう.簡単だからわざわざ関数用意するまでもないってことかな.

for(; first != last; ++first)
  first->~T();

一方で,これと(おおよそ)反対のことをやるuninitialized_fill, uninitialized_fill_n, uninitialized_copyは標準C++でも関数が用意されている.こちらも一見するとdestroyと同様にただfor文回せば良いように見えますけれど,例外安全性(Commit or Rollbackのsemanticsを持たないといけない)を考慮しだすときちんとtry-catchしないとならないからわざわざ用意しているんでしょう,多分.
ちなみに,iterator範囲に対するdestroyが上のように簡単なfor文で書けるのは,デストラクタがnothrowだという暗黙の仮定があるから出来る(この仮定が妥当であるという議論は「Exceptional C++」item 8, 16あたりが詳しい)ことである,と.