const&和const&&的二义性
#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只保证了运行时不直接被修改(但这个东西仍然可能是个动态变量)。下面我们来详细讲解下。
C++分数类设计:面向对象编程的典型实践
分数(Fraction)是编程中基础但极具教学价值的数值抽象类型,其核心在于用整数精确表示有理数,避免浮点误差并保障数学语义完整性。实现一个健壮的Fraction类需深入理解类封装、const引用传参、运算符重载、异常处理与不变式维护等C++面向对象核心原理。该设计不仅体现数据成员选型(int而非double)与接口设计(explicit构造、流重载)的技术权衡,更承载着从语法练习到工程思维跃迁的关键训练价值——广泛应用于算法课设、C++入门项目及数值计算模块开发中。
C++中const &传参优势[项目源码]
在C++编程中,使用const &作为函数参数传递具有多重优势。首先,它能显著提高程序效率,尤其是处理大型对象或数组时,避免了不必要的数据拷贝,直接操作原始数据。其次,const修饰符确保了参数在函数内部不会被意外修改,保障了数据安全性,特别适用于多模块共享数据的场景。此外,这种传参方式能提升代码可读性,明确表达函数不会修改参数的意图,便于团队协作和维护。对于内存敏感的应用,const &能减少大型数据结构的内存占用,同时在频繁调用的函数中优化性能表现。综合来看,const &是C++中处理非修改性大型数据传递的理想选择。
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引用不可以。 代码如下: //
static和const用法详解
C语言中比较经典的static和const的用法


