没有调用拷贝构造函数却提示调用了隐式的拷贝构造函数

在newNode.ptr = new Node(std::move(data))中,Node的初始化列表里发生了这次拷贝构造:data(std::move(std::make_shared\u0026lt;T\u0026gt;(std::move(data_)))). make_shared - C++ ReferenceAllocates and constructs an object of type T passing args to its constructor, and returns an object of type shared_ptr\u0026lt;T\u0026gt; that owns and stores a pointer to it (with a use count of 1).make_shared\u0026lt;T\u0026gt;将“move后过的类型为T\u0026amp;\u0026amp;的变量”传递给了T(亦即你的Test)的构造函数。1. 如果T类没有移动构造函数(move ctor),它的拷贝构造函数(copy ctor)会被调用#include \u0026lt;iostream\u0026gt;#include \u0026lt;memory\u0026gt;struct T{\tT() { std::cout \u0026lt;\u0026lt; "T()" \u0026lt;\u0026lt; std::endl; }\tT(const T\u0026amp; t) { std::cout \u0026lt;\u0026lt; "T(const T\u0026amp;)" \u0026lt;\u0026lt; std::endl; }//\tT(const T\u0026amp;\u0026amp; t) { std::cout \u0026lt;\u0026lt; "T(const T\u0026amp;\u0026amp;)" \u0026lt;\u0026lt; std::endl; }};int main(){\tT t;\tstd::cout \u0026lt;\u0026lt; "sp1 begin: " \u0026lt;\u0026lt; std::endl;\tstd::shared_ptr\u0026lt;T\u0026gt; sp1 = std::make_shared\u0026lt;T\u0026gt;();\tstd::cout \u0026lt;\u0026lt; "sp2 begin: " \u0026lt;\u0026lt; std::endl;\tstd::shared_ptr\u0026lt;T\u0026gt; sp2 = std::make_shared\u0026lt;T\u0026gt;(t);\tstd::cout \u0026lt;\u0026lt; "sp3 begin: " \u0026lt;\u0026lt; std::endl;\tstd::shared_ptr\u0026lt;T\u0026gt; sp3 = std::make_shared\u0026lt;T\u0026gt;(std::move(t));}执行:? test c++ rvalue.cpp -std=c++11 -o rvalue? test ./rvalueT()sp1 begin:T()sp2 begin:T(const T\u0026amp;)sp3 begin:T(const T\u0026amp;)2. 如果T有移动构造函数(把T定义中的注释取消),在构造sp3时移动构造函数将被调用(而不是拷贝构造):? test c++ rvalue.cpp -std=c++11 -o rvalue? test ./rvalueT()sp1 begin:T()sp2 begin:T(const T\u0026amp;)sp3 begin:T(const T\u0026amp;\u0026amp;)编译器版本:Apple LLVM version 7.0.0 (clang-700.0.72)Target: x86_64-apple-darwin14.5.0Thread model: posix
■网友
蟹妖。爪机无力,先占个坑。===================看不太出来。你有错误的堆栈么?这个错误是你的代码的什么地方使用的?


    推荐阅读