左辺値参照修飾メンバー関数と修飾されていないメンバー関数に違いはありますか? もしそうなら、それは何ですか?
つまり、これら 2 つの宣言方法はfunc()
異なるのでしょうか。
class Foo
{
void func();
void func() &;
};
の両方のバージョンが存在する場合、明らかに上記のクラスはコンパイルされないため、「オーバーロードの解決を許可するのに十分なほど異なるか」という意味ではありませんfunc()
。&
つまり、 が含まれている場合と含まれていない場合でコンパイラの動作が異なるのはなぜですか?
少なくとも 1 つの違いがあります。それは、ref 修飾された関数 (左辺値型または右辺値型のいずれか) は、ref 修飾されていない関数でオーバーロードできないことです。現在の標準ドラフトから:
同じ名前と同じ parameter-type-list を持つメンバー関数宣言、および同じ名前、同じ parameter-type-list、同じテンプレート パラメーター リストを持つメンバー関数テンプレート宣言は、それらのいずれかがある場合はオーバーロードできませんが、すべてではありませんが、ref 修飾子があります。
...しかし、これが唯一の違いである場合、なぜ制限があるのでしょうか? foo()&&
つまり、 (unqualified) の有効なオーバーライドとして扱われないのはなぜfoo()
ですか?