复制构造函数在 cpp 模板中不起作用
copy constructor do not work in cpp template
我正在写一个关于c++类型擦除的测试程序,代码放在最后。
当我运行编程时,测试用例2输出如下:
A default cstr...0x7ffe0fe5158f
obj_:0x7ffe0fe5158f objaaa 0x7ffe0fe5158f
Print A 0x7ffe0fe5158f
我的机器:Linux x86-64,gcc 4.8
在我看来,“对象 obj2(a2);”通过左值引用创建一个 class 模型,因此它应该调用 A 的复制构造函数,
但实际上并没有用,这让我很困惑。
谁能给个解释,先谢谢了
程序如下:
#include <memory>
#include <iostream>
class Object {
public:
template <typename T>
Object(T&& obj) : object_(std::make_shared<Model<T>>(std::forward<T>(obj))) {
}
void PrintName() {
object_->PrintName();
}
private:
class Concept {
public:
virtual void PrintName() = 0;
};
template <typename T>
class Model : public Concept {
public:
Model(T&& obj) : obj_(std::forward<T>(obj)) {
std::cout << "obj_:" << std::addressof(obj_) <<" objaaa " << std::addressof(obj) << std::endl;
}
void PrintName() {
obj_.PrintName();
}
private:
T obj_;
};
private:
std::shared_ptr<Concept> object_;
};
class A {
public:
A(A& a) {
std::cout<< "A copy cstr...a" << this << std::endl;
}
A(A&& a) {
std::cout << "A move cstr...." <<this<< std::endl;
}
A() {
std::cout << "A default cstr..." <<this<< std::endl;
}
void PrintName() {
std::cout << "Print A " << this << std::endl;
}
};
int main(void)
{
// test case 1
Object obj{A()};
obj.PrintName();
// test case 2
A a2;
Object obj2(a2);
obj2.PrintName();
return 0;
}
在Object obj2(a2);
中,没有复制。 Object
的构造函数中的T
被推导为A&
,所以它实例化了Model<A&>
,它存储了对原始a2
对象的引用作为它的obj_
成员.
观察在调试输出中,a2
的构造函数、Model
的构造函数和 PrintName
都打印相同的地址。您可以进一步确认这个地址实际上是 &a2
.
我正在写一个关于c++类型擦除的测试程序,代码放在最后。
当我运行编程时,测试用例2输出如下:
A default cstr...0x7ffe0fe5158f
obj_:0x7ffe0fe5158f objaaa 0x7ffe0fe5158f
Print A 0x7ffe0fe5158f
我的机器:Linux x86-64,gcc 4.8
在我看来,“对象 obj2(a2);”通过左值引用创建一个 class 模型,因此它应该调用 A 的复制构造函数, 但实际上并没有用,这让我很困惑。
谁能给个解释,先谢谢了
程序如下:
#include <memory>
#include <iostream>
class Object {
public:
template <typename T>
Object(T&& obj) : object_(std::make_shared<Model<T>>(std::forward<T>(obj))) {
}
void PrintName() {
object_->PrintName();
}
private:
class Concept {
public:
virtual void PrintName() = 0;
};
template <typename T>
class Model : public Concept {
public:
Model(T&& obj) : obj_(std::forward<T>(obj)) {
std::cout << "obj_:" << std::addressof(obj_) <<" objaaa " << std::addressof(obj) << std::endl;
}
void PrintName() {
obj_.PrintName();
}
private:
T obj_;
};
private:
std::shared_ptr<Concept> object_;
};
class A {
public:
A(A& a) {
std::cout<< "A copy cstr...a" << this << std::endl;
}
A(A&& a) {
std::cout << "A move cstr...." <<this<< std::endl;
}
A() {
std::cout << "A default cstr..." <<this<< std::endl;
}
void PrintName() {
std::cout << "Print A " << this << std::endl;
}
};
int main(void)
{
// test case 1
Object obj{A()};
obj.PrintName();
// test case 2
A a2;
Object obj2(a2);
obj2.PrintName();
return 0;
}
在Object obj2(a2);
中,没有复制。 Object
的构造函数中的T
被推导为A&
,所以它实例化了Model<A&>
,它存储了对原始a2
对象的引用作为它的obj_
成员.
观察在调试输出中,a2
的构造函数、Model
的构造函数和 PrintName
都打印相同的地址。您可以进一步确认这个地址实际上是 &a2
.