複製構造函數在 cpp 模板中不起作用

海軍

我正在寫一個關於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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在 CPP 類的構造函數中初始化二維數組

自定義函數在模板中不起作用

類構造函數似乎不起作用?

參數中的模板文字不起作用

ContinueWith() 中的函數不起作用

即使我在.cpp文件中实例化了一个虚拟对象,.cpp文件中的模板函数的定义也不起作用

Cpp/C++ 為默認構造函數分配默認值

RcppTN .cpp脚本在来源时起作用,但在库中编译时不起作用

如何在innerClass構造函數中調用outerClass構造函數

在 bloc 構造函數中調用超級構造函數後調用函數

複製省略並移動構造函數

基於類型的構造函數模板特化

onclick 函數在 javascript 中不起作用

reload=true 在@click 函數中不起作用

C ++模板头文件cpp分离,将* .cpp包含到* .h中的解决方案不再起作用

使用模板時的 C++ 構造函數或遞歸成員函數

Singleton中的函子不起作用

类模板cpp,hpp,cpp

如果.h包含在多个.cpp中,则.h中的结构不起作用?

Flutter:在構造函數中調用 setState()

在 C++ 中按值傳遞期間未使用複制構造函數

在cpp文件中使用内联命名空间中的类型在MSVS中不起作用

是否可以在類構造函數中調用類成員構造函數?

為什麼我不能在函數中設置我的構造函數?

openfl-音频在cpp目标上不起作用

CPP:重载的嵌套运算符不起作用

AMQP-CPP-RabbitMQ事件循环不起作用

TypeScript - matchAll() 函數不起作用

當複制構造函數在 C++ 中不可用時,為什麼不調用複制賦值運算符?