函数末尾的&&含义?带&&的virtual成员函数声明解析
C++右值引用限定符(Ref-qualifiers)问题解答
Hey there! Let's clear up your confusion about those trailing && in C++ member functions:
1. 函数末尾的&&是什么含义?
这个&&是C++11引入的右值引用限定符,它的作用是限制成员函数只能被右值对象调用。
在C++中,对象分为左值(可以取地址、有持久生命周期的对象,比如命名变量)和右值(临时对象、字面量等,没有持久生命周期)。通过给成员函数添加ref-qualifier,我们可以区分函数的调用场景:
- 不带限定符的成员函数:可以被左值和右值对象调用
- 带
&的左值限定符:只能被左值对象调用 - 带
&&的右值限定符:只能被右值对象调用
举个简单例子:
struct MyClass { void func() & { // 只能被左值对象调用 std::cout << "Called on lvalue\n"; } void func() && { // 只能被右值对象调用 std::cout << "Called on rvalue\n"; } }; int main() { MyClass a; a.func(); // 调用左值版本,输出"Called on lvalue" MyClass().func(); // 调用右值版本,输出"Called on rvalue" }
2. virtual int g(int) &&; 表示什么意思?
这行代码声明了一个带右值引用限定符的虚成员函数,拆解来看:
virtual:表明这是一个虚函数,派生类可以重写它int:函数返回值类型g(int):函数名为g,接受一个int类型的参数&&:右值引用限定符,意味着这个函数只能被右值类型的S对象(或其派生类的右值对象)调用
另外需要注意:当重写这个虚函数时,派生类中的重写函数必须匹配相同的ref-qualifier,否则不会构成重写。
再看你给出的代码片段:
struct S { virtual int f(char) const, g(int) &&;; // 声明两个非静态成员函数 virtual int f(char), x; // 编译时错误:decl-specifier-seq中的virtual仅允许用于非静态成员函数声明 };
第一行的逗号分隔声明是合法的:它同时声明了两个虚成员函数——f(char) const(const限定的虚函数)和g(int) &&(右值限定的虚函数)。
而第二行的错误原因是:x是一个数据成员,virtual关键字只能用于修饰非静态成员函数,不能修饰数据成员,所以编译器会报错。
内容的提问来源于stack exchange,提问作者longack
相关产品推荐
相关产品推荐

