cxx 98/03里,
HasPtr hp4 = HasPtr(1,str);
语法上讲,是调用拷贝构造,而HasPtr(1,str)是个右值,是带const的,(不过cxx 11及以上,是右值引用),HasPtr(HasPtr &),这种,自然就编译不过了;
之所以没用到,那是编译器优化,叫做copy elision,实际就是直接调用了一次构造,没有出现临时对象,印象中这个功能VC是关不掉的,g++可以通过--fno-elide-constructors选项关闭;