gpt4 book ai didi

c++ - 编译似乎不遵循不同 operator= 重载之间的正确路径

转载 作者:行者123 更新时间:2023-11-30 04:17:07 25 4
gpt4 key购买 nike

我有两个矩阵类,一个用于 CPU,一个用于 GPU,分别是 MatrixCudaMatrix。声明和定义在文件 .h.cpp.cuh.cu 中。在 main 中,我有

Matrix<int2_>      foo1(1,2);
// Definition of the elements of foo1...
CudaMatrix<int2_> foo2(1,2);

cout << typeid(foo1).name() << "\n";
cout << typeid(foo2).name() << "\n";

// Equality
foo2=foo1;

现在,我在 CudaMatrixMatrix 之间没有 operator= 重载,但我有以下 operator= 重载

const CudaMatrix& operator=(const CudaMatrix<LibraryNameSpace::int2_>&);

在两个 CudaMatrix 之间。发生的情况如下:

  1. 两个 typeidfoo1foo2 返回正确的类;
  2. 上面的 operator= 重载在运行时为 foo2=foo1 赋值编译和调用。相反,我本以为会出现编译错误;
  3. 分配的结果导致 foo2正确结果!

我正在使用 Visual Studio 2010 并在 Release模式下进行编译。

有人对为什么会出现这种明显不合逻辑的行为有一些提示吗?

谢谢。

最佳答案

它们之所以起作用的关键是因为您同时拥有复制构​​造函数和显式复制赋值运算符。这两件事一起使看似未定义的案例正确运行。所以当你这样做时:

Matrix<int2_>      foo1(1,2);
CudaMatrix<int2_> foo2(1,2);

foo2 = foo1;

发生的事情等同于:

Matrix<int2_>      foo1(1,2);
CudaMatrix<int2_> foo2(1,2);

// foo2 = foo1;
{
CudaMatrix<int2_> x(foo1); // copy constructor
foo2 = x; // Copy assignment
}

请注意,您应该注意此处的设备内存使用影响(即两个设备内存分配和两组您在幕后进行的任何 API 调用)。

值得指出的是,这不是 CUDA 特定的,它是 C++98 对象模型的标准功能。您可能会受益于修改 rule of three如果您想了解更多关于它如何工作以及为什么工作的信息(以及为什么看似类似的反例不起作用)。

关于c++ - 编译似乎不遵循不同 operator= 重载之间的正确路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17294547/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com