C++0xには、implicit object parameter(*thisが参照するオブジェクト)を、lvalueリファレンスで受けるか、rvalueリファレンスで受けるかを指定する機能がある。これを、リファレンス修飾子(ref-qualifier)という。
struct S { // void S::f(void) & void f() & ; // void S::f(void) && void f() && ; // リファレンス修飾子が省略された関数 // thisの参照先はlvalueリファレンス void g() ; } ; int main() { S s ; s.f() ; // void S::f(void) &を呼ぶ std::move(s).f() ; // void S::f(void) &&を呼ぶ }
リファレンス修飾子の有無は、関数の型に影響する。ここでは、void f() & ;と、void g() ;は、意味的には同じだが、違う型である。ただし、リファレンス修飾子の有無によって、オーバーロードをすることはできない。
struct S { // void S::f(void) & void f() & ; // void S::f(void) && void f() && ; // エラー、 void f() ; } ;
もし、ある関数名にリファレンス修飾子を書く場合、その関数名のオーバーロード関数には、すべてリファレンス修飾子が書かれていなければならない。あるオーバーロード関数でリファレンス修飾子を省略するのであれば、どのオーバーロード関数にも、リファレンス修飾子を書いてはならない。
残念ながら、リファレンス修飾子を実装しているコンパイラーは、まだこの世に存在しない。
No comments:
Post a Comment
You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.