c++ - 为什么即使该对象没有复制构造函数,也可以按值传递对象?

标签 c++

根据 this question当对象按值传递给另一个函数时,将调用复制构造函数。

我删除了我的复制构造函数作为测试,但仍然可以按值传递它。这有意义吗?

我注释掉了拷贝构造函数:

 /*
Matrix4(const Matrix4<T>& m)
{
    x.x = m.x.x; x.y = m.x.y; x.z = m.x.z; x.w = m.x.w;
    y.x = m.y.x; y.y = m.y.y; y.z = m.y.z; y.w = m.y.w;
    z.x = m.z.x; z.y = m.z.y; z.z = m.z.z; z.w = m.z.w;
    w.x = m.w.x; w.y = m.w.y; w.z = m.w.z; w.w = m.w.w;
}
 */

typedef Matrix4<float> mat4;

然后编译并运行良好:

void ttt(mat4 hi){

}

void yyy(){
    mat4 x;
    ttt(x);
}

所以在这种情况下可能不会调用复制构造函数?这里发生了什么?

最佳答案

如果您不提供复制构造函数,编译器会为您生成一个,在您按值传递时使用它(在 C++11 中,也有可能在某些情况下调用移动复制构造函数。 ) 要真正禁用它,您应该将其声明为私有(private),或者在 C++11 中删除它:

class Foo
{
 private:
  Foo(const Foo&);
};

class Foo11
{
 public:
  Foo(const Foo&) = delete;
};

关于c++ - 为什么即使该对象没有复制构造函数,也可以按值传递对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15847921/

相关文章:

c++ - 如何在 C++ 中使用回调?

c++ - 在定义结构之前如何使用指向结构的指针?

c++ - 为什么使用 select() 调用对 inotify 实例执行选择性读取

c++ - 讨论-创建矩阵时 vector 的数组与 vector -最实用的选择是什么?

c++ - OpenGL 扩展问题

c++ - 在 C++ 中创建不可变且高效的类的惯用方法

c++ - (函数)模板的 C++ 非类型参数是否有序?

c++ - 反转 vector 并打印它

c++ - 创建一个将 ostream 作为参数并写入该流的打印函数

c++ - std::cout operator<< 的奇怪行为