C++ 空体重载运算符神奇地工作

C++ 空体重载运算符神奇地工作,c++,C++,我遇到了以下奇怪的行为,我不知道发生了什么 我有一个名为mvec的向量类,它在数组中存储实际值,还有一个名为mvec\u transf的类,它是另一个向量的转换。它存储对另一个向量的引用,以及定义转换的一元函数。这就是它的使用方法: mvec<int, 3> vec1 {1, 2, 3}; mvec_transf<mvec<int, 3>, std::negate<int>> vec2

我遇到了以下奇怪的行为,我不知道发生了什么

我有一个名为
mvec
的向量类,它在数组中存储实际值,还有一个名为
mvec\u 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]
奇怪的是,这个实现(没有主体)可以工作。如果我注释掉定义,我会从编译器中得到一个不匹配的运算符错误。如果我没有这样做,代码编译时会出现缺少返回类型和未使用变量“v”的警告。当我运行
auto vec2=-vec1
时,
vec2
实际上包含一个正在工作的
mvec\u transf
对象,该对象具有对
vec1
的正确引用

通过添加一个print语句,我可以确认重载的操作符确实被调用了。但是,对于print语句,
vec2
包含对垃圾的引用,而不是对
vec1
的引用


这是怎么回事?

你所拥有的只是未定义的行为。从[stmt.return]:

从函数末尾流出相当于没有值的返回;这会导致值返回函数中出现未定义的行为


一种未定义的行为是神奇的工作代码。另一种类型是神奇地破坏你的硬盘代码。我不会指望它能神奇地工作很长时间。修好它

你所拥有的只是未定义的行为。从[stmt.return]:

从函数末尾流出相当于没有值的返回;这会导致值返回函数中出现未定义的行为

一种未定义的行为是神奇的工作代码。另一种类型是神奇地破坏你的硬盘代码。我不会指望它能神奇地工作很长时间。修好它

别忘了,别忘了
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;*/ }