我遇到了以下奇怪行为,无法弄清发生了什么。
我有一个称为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/