我正在寫一個關于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;
}
uj5u.com熱心網友回復:
在 中Object obj2(a2);,不進行復制。T在 的建構式中Object被推匯出為A&,因此它實體化Model<A&>,它將對原始a2物件的參考存盤為它的obj_成員。
觀察在您的除錯輸出中,a2的建構式、Model的建構式和PrintName所有列印相同的地址。你可以進一步確認這個地址是真的&a2。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/333139.html
上一篇:如何根據回傳型別推匯出模板引數?
下一篇:如何使用元編程在C 中撰寫此函式
