C++类成员函数后加&、&&、const&、const&&的含义是什么
C++ 成员函数引用限定符含义说明
你看到的&、&&、const&、const&&是C++11标准引入的成员函数引用限定符,作用是限定该成员函数仅能被对应值类别、对应const属性的类对象调用,其中const的语义和你已知的一致:带const的限定符依然保证函数内部不会修改类的非mutable成员。
四个变体的具体含义如下:
func_name() &:仅能被非const左值对象调用。比如你声明类的普通变量Demo d;,调用d.func_name()就会匹配这个版本,非const的右值对象(比如临时对象、被std::move修饰的普通对象)调用该函数会编译报错。func_name() &&:仅能被非const右值对象调用。比如调用Demo().func_name()(临时对象属于右值)、std::move(d).func_name()都会匹配这个版本,通常用来做移动语义优化:因为调用该版本的对象马上就要销毁,可以直接转移内部资源,避免不必要的拷贝。func_name() const&:适配范围最广的const版本,可被所有左值对象(无论是否带const)、const右值对象调用,语义和普通const成员函数完全一致,保证函数内部不会修改类成员。func_name() const&&:仅能被const修饰的右值对象调用,属于语义补全的场景,实际开发中使用频率较低,同样保证函数内部不会修改类成员。
典型使用场景
引用限定符最常见的作用是避免悬空引用、优化资源拷贝,示例如下:
class User { std::string username; public: // 仅左值对象允许返回内部字符串的引用,避免临时对象调用时返回悬空引用 std::string& get_name() & { return username; } // 右值对象直接返回移动后的字符串,无需拷贝 std::string get_name() && { return std::move(username); } // const对象返回const引用 const std::string& get_name() const& { return username; } };
内容的提问来源于stack exchange,提问作者roulette01
相关产品推荐
相关产品推荐

