我遇到了以下奇怪行为,无法弄清发生了什么。

我有一个称为mvec的向量类,该向量类将实际值存储在数组中,还有一个名为mvec_transf的类,它是另一个向量的转换。它存储对另一个向量的引用,以及定义转换的一元函数。这是可以使用的方式:

mvec<int, 3>                                vec1 {1, 2, 3};
mvec_transf<mvec<int, 3>, std::negate<int>> vec2 {vec1, std::negate<int>()};
// `vec2` contains [-1 -2 -3]


我重载了operator-以便可以编写auto vec2 = -vec1;,这是我当前的实现:

template <class Vec_t>
mvec_transf<Vec_t, std::negate<typename Vec_t::elem_t>>
operator- (Vec_t& v)
{  /*std::out << "Hello from operator- " << std::endl;*/ }


神秘地,此实现(无主体)有效。如果我注释掉该定义,那么编译器将不会匹配任何操作员错误。如果我不这样做,则代码编译时会带有警告,提示缺少返回类型和未使用的变量“ v”。当我运行auto vec2 = -vec1时,vec2实际上包含一个有效的mvec_transf<..>对象,该对象具有对vec1的正确引用。

通过添加一条打印语句,我可以确认重载的运算符实际上已被调用。但是,对于print语句,vec2包含对垃圾的引用,而不是对vec1的引用。

这里发生了什么?

最佳答案

您所拥有的只是未定义的行为。来自[stmt.return]:


  从函数末尾流出就等于没有值的返回;这导致返回值函数中的行为不确定。


一种未定义的行为是神奇的工作代码。另一种类型是魔术地破坏您的硬盘驱动器代码。我不会长期依靠它神奇地工作。修理它!

关于c++ - 空着 body 的重载运算符(operator)神奇地工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32398088/

10-10 02:06