読者です 読者をやめる 読者になる 読者になる

1要素Range

C++

Ovenにはsingleという、オブジェクトを1要素のRangeと見なすための関数があります。実装はこんな感じです:

template <class T>
iterator_range<const T*> single(const T& x)
{
    return make_iterator_range(boost::addressof(x), boost::addressof(x) + 1);
}

この実装の、終了ポインタを&x + 1でとっている部分が規格的に保証されているのかをレビューで聞かれたので、Ovenの現メンテナチームで調べていて、hotさんが見つけてくれました。N3337に以下の記述があります。

5.7.4
For the purposes of these operators, a pointer to a nonarray object behaves the same as a pointer to the first element of an array of length one with the type of the object as its element type.

非配列オブジェクトへのポインタは、そのオブジェクトを第1要素とする長さ1の配列の、第1要素へのポインタと同様に作用する。
といったことが書かれています。


&x == numeric_limits::max()のときにまずそう、という懸念がありましたが、上記のような記述があるので大丈夫なんでしょう。