なんで requirement に関する推論が欲しくなったかというと,以下のようなのを見てたらうにゅーんっていう.
たとえば,
// とりあえず細かいことはおいといて,「型 T はデフォルトコンストラクタを持ってる」という制約の記述だと思って! concept DefaultConstructible<typename T> { T::T(); } template<class T> requires DefaultConstructible<T> // 関数テンプレート f は,その型パラメタ T が // デフォルトコンストラクタを持っていないといけない,という記述 T f() { // 関数テンプレートの実装では,制約で宣言したインタフェイスしか*使ってはならない*. // たとえばここの f の実装では, DefaultConstructible<T> という制約の宣言から導出できる // インタフェイスの集合 (T に対するデフォルトコンストラクタ) しか*使ってはならない*. return T(); }
で,まぁ,この f の実装は怒られるんですけれどね.デフォルトコンストラクタしか使ってない(?)のにねぇ……っていう.
上記のはまだわかりやすいですけれど
concept DefaultConstructible<typename T> { T::T(); } template<class T> requires DefaultConstructible<T> void f() { T t; T &r = t; }
これもまた f の定義時点で怒られる (ハズ……型 T に一体デフォルトコンストラクタ以外の何が必要だとっ!?) んですが,こういうのになるとパッと見て一体何が間違いなのやら……っていう.
こういうのが (今現在の proposal に厳密に従うと) テンプレートの定義時点で事細かにはじかれる (まぁ,なんて厳しいコンパイラなんでしょう!) ので,上に上げたときに「すい」そ,下に「ろん」ちょっとやってみよっか,でして…….
こういう煩わしさは concept の継承(Generic Programming@C++ 的にかっちょ良く refinement って言おうね!) ガンガン使って concept 間の含意関係書いとけばかなりの程度解決する……ってか,含意関係のために refinement 使いまくってたらすぐに名前が曖昧になる (ダイアモンドだね〜 あぁ〜 あぁ〜♪) んじゃねー……あれ?もしかして名前の重複許すのかっ!?って調べたらやっぱり名前の重複許してた(^o^)キャー.
14.9.3.1 Concept member lookup
5 When name lookup in a concept scope C results in an overload seta set of associated functions, duplicate associated functions are removed from the overload set. If more than one associated function in the overload set has the same signature, the associated function found first by a depth-first traversal of the refinement clauses of C starting at C will be retained and the other associated functions will be removed as duplicates. [ Example:
concept A{
T f(T); // #1a
}
concept B{
T f(T); // #1b
T g(T); // #2a
}
concept C: A , B {
T g(T); // #2b
}
template
requires C
void h(T x) {
C::f(x); // overload set contains #1a; #1b was removed as a duplicate
C::g(x); // overload set contains #2b; #2a was removed as a duplicate
}
—end example ]
ヽ(゚∀゚)ノワーイ.いや,わーいじゃなくて 実装の多重継承許さない言語ならできて当然だろうし (e.g.), C++0x の concept においても (実装が書けないんだから) 実装の曖昧性が起きないから特に否定する理由ないし.
#あーれー? concept に default implementation 書いてたらまずいことが起きるんじゃ?