const&和const&&的二义性

杨四正的源码剖析课 杨四正的源码剖析课 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
#include <iostream>
#include <memory>
#include <utility>

using namespace std;

class strange {
public:
mutable size_t count = 20;
strange() {
}

strange(const strange& o) :
count(o.count) {
cout << "strange(const strange& o)" << endl;
}

strange(const strange&& o) :
count(o.count) {
cout << "strange(const strange&& o)" << endl;
o.count = 0;
}

void testMethod(const strange&) {
cout << "testMethod(const &)" << endl;
}

void testMethod(const strange&&) {
cout << "testMethod(const &&)" << endl;
}

void testMethod(strange &) {
cout << "testMethod(&)" << endl;
}

void testMethod(strange &&) {
cout << "testMethod(&&)" << endl;
}
//==========================================
void testMethod() const& {
cout << "testMethod()const &" << endl;
}

void testMethod() & {
cout << "testMethod()&" << endl;
}

void testMethod() && {
cout << "testMethod()&&" << endl;
}

// OK:带来引用限定符...
void testMethod() const&& {
cout << "testMethod()const &&" << endl;
}
};

int main(int argc, char **argv) {
const strange s;
strange s2 = s;
strange s3 = move(s);

cout << s.count << endl;
cout << s2.count << endl;
cout << s3.count << endl;

s2.testMethod(move(s)); // OK...
s2.testMethod(s);// OK...
s2.testMethod(s2);// OK...
s2.testMethod(move(s2));// OK...

s2.testMethod();// OK...
s.testMethod();// OK...
strange().testMethod();// OK...
move(s).testMethod();// ERROR...
// error: call of overloaded 'testMethod()' is ambiguous
// note: candidates are:
// ..\src\Test3.cpp:40:7: note: void strange::testMethod() const &
// void testMethod() const& {
// ^
// ..\src\Test3.cpp:53:7: note: void strange::testMethod() const &&
// void testMethod() const&& {
// ^
return 0;
}

求解释,为什么作为参数的时候就没问题,作为成员函数的限定符的时候,就会出现二义性的问题?成员函数的限定符不是限定this的吗?不也是个参数吗?
...全文

相关推荐

C++中的const和constexpr详解

C++ const 和 constexpr 的区别呢,constexpr表示这玩意儿在编译期就可以算出来(前提是为了算出它所依赖的东西也是在编译期可以算出来的)。而const只保证了运行时不直接被修改(但这个东西仍然可能是个动态变量)。下面我们来详细讲解下。

weixin_38557768

C++分数类设计:面向对象编程的典型实践

分数(Fraction)是编程中基础但极具教学价值的数值抽象类型,其核心在于用整数精确表示有理数,避免浮点误差并保障数学语义完整性。实现一个健壮的Fraction类需深入理解类封装、const引用传参、运算符重载、异常处理与不变式维护等C++面向对象核心原理。该设计不仅体现数据成员选型(int而非double)与接口设计(explicit构造、流重载)的技术权衡,更承载着从语法练习到工程思维跃迁的关键训练价值——广泛应用于算法课设、C++入门项目及数值计算模块开发中。

酸流

C++中const &传参优势[项目源码]

在C++编程中,使用const &作为函数参数传递具有多重优势。首先,它能显著提高程序效率,尤其是处理大型对象或数组时,避免了不必要的数据拷贝,直接操作原始数据。其次,const修饰符确保了参数在函数内部不会被意外修改,保障了数据安全性,特别适用于多模块共享数据的场景。此外,这种传参方式能提升代码可读性,明确表达函数不会修改参数的意图,便于团队协作和维护。对于内存敏感的应用,const &能减少大型数据结构的内存占用,同时在频繁调用的函数中优化性能表现。综合来看,const &是C++中处理非修改性大型数据传递的理想选择。

sql99

c++ const引用与非const引用介绍

const引用是指向const对象的引用。 代码如下: const int i = 10; const int &ref = i; 可以读取ref,但不能修改。这样做是有意义的,因为i本身就不可修改,当然也不能通过ref来修改了。所以也就有将const变量赋值给非const引用是非法的。 代码如下: int &ref1 = i; // error: nonconst reference to a const object 非const引用是指向非const类型变量的引用。 const引用可以初始化为不同类型的对象或者右值(如字面值常量),但非const引用不可以。 代码如下: //

weixin_38522552

static和const用法详解

C语言中比较经典的static和const的用法

小松的林子
评论 7
收藏 已收藏
分享
返回顶部
杨四正的源码剖析课
杨四正的源码剖析课 领域专家: 大数据技术领域 领域专家: 大数据技术领域
C++ 语言 65,214 成员 250,514 内容