c++ - 分配给在 C++ 中创建的对象

标签 c++ templates operator-overloading

我正在编写一些函数来对 vector 数据进行操作。

我定义了不可复制的对象(私有(private)复制构造函数和赋值运算符)。

然后我定义了模板化运算符=

template <typename G>
inline const TMatrix &operator=(const G &gen) {
    ir_mat::Copy<G, Dimension>::start(m_data, gen);
    return *this;
}

和一些额外的运算符,如“+”、“*”,如 article 中所述.

现在我可以将表达式的结果赋给一个对象:

Vector3f v1, v2, v3;
v1 = v2 + v3;

为什么我不能在一条语句中声明一个变量并对其赋值?

Vector3f v1, v2;
Vector3f v3 = v1 + v2;

是不是因为这个赋值试图在实例化变量之前创建一个临时对象,然后将其复制到新对象中? 我也可以使用我的运算符“=”来实例化新对象,而无需临时存储吗?我是否必须为此定义一个特殊的构造函数?

更新

我还定义了一个模板化的复制构造函数(可能是最简单的形式):

template <typename G>
TMatrix(const G &data) {
    operator=(data);
}

现在我还可以将 v3 实例化为:

Vector3f v3(v1 + v2);

但在其他作业中仍然没有运气:

Vector3f v3 = v1 + v2;

最佳答案

这个初始化:

 Vector v3(v1 + v2);

将调用您的模板构造函数。

这个初始化:

 Vector v3 = v1 + v2;

最终被翻译成这样:

 Vector v3(Vector(v1 + v2));

从本质上讲,编译器会尝试使用复制构造函数,并在这样做时试图弄清楚如何将初始化器转换为适当的类型。

选择创建一个可从随机类型分配给的类型,但不能复制分配或复制构造是一个非常奇怪的选择。我看到我认为您这样做是为了避免临时工的假设是正确的。除非你这样做不是因为临时对象非常昂贵,而是因为你想要构建一个稍后将被评估的表达式。大概是因为您想向量化复杂的表达式评估。

是的,您将不能为此使用初始化的赋值形式。至少,我想不出让它发挥作用的方法。

我的建议是以某种方式将 Vector 转换为您正在构建的表达式的句柄。该句柄可以是作为输入的实 vector 的句柄。或者它可能是 VectorExpression 的句柄,它是对 vector 进行运算的结果。

如果您不想共享您所处理的对象的所有权,您仍然无法实现复制分配或复制构造。但在 C++11 中,您仍然可以实现句柄的移动构造和移动分配。

关于c++ - 分配给在 C++ 中创建的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14814283/

相关文章:

c++ - 在结构中重载双等于运算符?

c++ - 为什么 "using namespace std;"被认为是不好的做法?

c++ - QLabel 扩展以适应一个大图像,但不能收缩以适应一个小图像

c++ - 如何在字符串 C++ 中解析简单的 json?

c++ - 如何将两个类之间的严重依赖性表达为子类化的一种契约?

c++ - 使用模板函数作为模板参数

delphi - Delphi Win32 中的类帮助器和字符串

c++ - 将 C++ 字符数组自动转换为字符串

c++ - "invalid use of incomplete type"部分模板特化错误

c++ - 快速而肮脏的运营商!=