C++ 为什么这个C++;构造函数是否自动指向复制构造函数?

C++ 为什么这个C++;构造函数是否自动指向复制构造函数?,c++,C++,我越来越 Severity Code Description Project File Line Suppression State Error C2280 'World::World(const World &)': attempting to reference a deleted function 作为调用行的错误(因为我的类中没有复制构造函数) World wd = World(&vp, am); 这是一个构造函数 我很

我越来越

Severity    Code    Description    Project    File    Line    Suppression State
Error    C2280    'World::World(const World &)': attempting to reference a
deleted function
作为调用行的错误(因为我的类中没有复制构造函数)

World wd = World(&vp, am);
这是一个构造函数

我很困惑为什么复制构造函数会被自动指向

有人知道吗

这是我的班级标题:

class World{
    public:
        KDtree tree;
        ViewPlane *vp;
        DrawPanel * paintArea = &(DrawPanel(wxString("test"), wxDefaultPosition, 400,400));
        wxApp app;
        Vector3d backGround;
        vector <Geometry*> objects;
        Shader shader;
        vector<Light*>lights;

        World(ViewPlane*, Vector3d& Am);
        ....
}
使用:

上述声明的作用如下:

  • 使用简单的构造函数为 阶级世界
  • 使用构造函数创建World类型的对象 世界(constworld&)
  • 对步骤1中创建的对象调用~World()
  • 因此,最好的方法是使用:

    World wd(&vp, am);
    
    它本质上是通过调用类世界的简单构造函数在堆栈上创建一个新对象

    另一种(繁琐的)方法是使用新操作符:

    World *wd = new World(&vp, am);
    
    使用

    Bar b = Bar(...)
    
    语法实际上执行复制初始化:

    你可能只想

    World wd(&vp, am);
    

    相反。

    除了其他答案之外,我想指出的是,由于C++17由于保证了拷贝省略,所以像
    T=T()
    这样的表达式中不涉及来自临时对象的拷贝。在C++17之前,不需要现有且可访问的副本构造函数。

    World wd = World(&vp, am);
    
    被解释为“使用表达式
    World(&vp,am)
    构造一个
    World
    对象,然后使用该对象来复制构造局部变量
    World wd
    。大多数编译器将省略复制步骤,但标准仍然要求复制构造函数,它们不会调用

    在C++17中,编译器需要省略副本,因此即使没有副本构造函数,也可以编译此代码片段。 因此,您可以选择使用C++17或使用语法

    World wd{&vp, am};
    

    (用括号代替大括号也可以。)

    您可能想写
    World wd{&vp,am};
    ,因为这样做时
    shader=(shader(Ambient))你正在调用复制构造函数。C++编译器解释了语法。它确实有效,但是为什么不使用新的有这个行为?我是C++的新手,唯一的区别是关于堆栈和堆。抱歉,这是一个坏的答案。这里使用<代码>新< /代码>完全不必要,只会使事情变得更混乱。很难管理。@NEoYang我在编辑中提到了解释。当然,我们可以使用
    auto&&b=…
    ,因为C++11避免了复制。(这实际上只是将两个其他答案合并为一个,以获得更完整的问题答案。)
    World wd = World(&vp, am);
    
    World wd{&vp, am};