所谓“编译器以引用对象的类型做为auto的类型”自测代码
#include <iostream> class CTestA { public: CTestA(){ std::cout<<"CTestA(){"<<std::endl; } CTestA(const CTestA &){ std::cout<<"CTestA(const CTestA &){"<<std::endl; } int value; }; class CTestB { public: const CTestA & GetObj()const{return obj_;} private: CTestA obj_; }; void funcTest() { CTestB obj; // CTestA(){ auto objtt = obj.GetObj(); // CTestA(const CTestA &){ // objtt 被推导的类型说明:obj.GetObj()返回的是引用对象,而auto推导的是“引用对象的类型”也就是 CTestA , // 所以这是个变量定义,而不是引用别名绑定,所以会调用拷贝构造函数 const CTestA & objttt2 = obj.GetObj(); const auto & objt2222 = obj.GetObj(); // 没有构造函数调用 auto & objt222222 = obj.GetObj(); // 没有构造函数调用 objt222222是对常量的引用 // objt222222.value = 999; // 编译不过,error C3490: 由于正在通过常量对象访问“value”,因此无法对其进行修改 CTestA objttt3 = obj.GetObj(); //CTestA(const CTestA &){ }
顺便说下底层const,比较好的记忆方法,可以记为 const修饰的是指针指向的那个对象的性质