我正在寫一個關於c++類型擦除的測試程序,代碼放在最後。
當我運行程序時,測試用例 2 輸出如下:
A default cstr...0x7ffe0fe5158f
obj_:0x7ffe0fe5158f objaaa 0x7ffe0fe5158f
Print A 0x7ffe0fe5158f
我的機器:Linux x86-64,gcc 4.8
在我看來,“對象 obj2(a2);” 通過左值引用創建一個類Model,所以它應該調用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);
,不進行複制。T
在 的構造函數中Object
被推導出為A&
,因此它實例化Model<A&>
,它將對原始a2
對象的引用存儲為它的obj_
成員。
觀察在您的調試輸出中,a2
的構造函數、Model
的構造函數和PrintName
所有打印相同的地址。你可以進一步確認這個地址是真的&a2
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句