ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

C++ 左值右值学习

C++ 左值右值学习 int x 10;代码学习#includeiostream#includecstdio#includeutility// std::moveclasscircle{public:circle(){puts(默认构造);}circle(constcircleother){puts(拷贝构造);}circle(circleother)noexcept{puts(移动构造);}};voidconsume(circle c){puts(进入 consume);}voidinspect(constcirclec){puts(进入 inspect);}voidaccept(circlec){puts(进入 accept);}intmain(){std::cout --1-- std::endl;circle a;// 默认构造std::cout --2-- std::endl;circleb(a);// 拷贝构造std::cout --3-- std::endl;circlec(std::move(a));// 移动构造std::cout --4-- std::endl;consume(a);// 拷贝构造参数 cstd::cout --5-- std::endl;consume(std::move(a));// 移动构造参数 cstd::cout --6-- std::endl;inspect(std::move(a));// 只绑定引用不调用移动构造std::cout --7-- std::endl;accept(std::move(a));// 只绑定引用不调用移动构造std::cout --8-- std::endl;circlerefstd::move(a);// 只绑定引用circleb2(ref);// 拷贝构造。注意虽然 ref 的声明类型是 circle但表达式 ref 是左值。std::cout --9-- std::endl;circlec2(std::move(ref));// 移动构造std::cout --10-- std::endl;circle a2circle();return0;}输出结果为--1--默认构造--2--拷贝构造--3--移动构造--4--拷贝构造 进入 consume--5--移动构造 进入 consume--6--进入 inspect--7--进入 accept--8--拷贝构造--9--移动构造--10--默认构造
返回列表