c++ - body 空虚的重载运算符神奇地工作

标签 c++

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

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

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]:

Flowing off the end of a function is equivalent to a return with no value; this results in undefined behavior in a value-returning function.

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

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

相关文章:

c++ - C++ 中的 MPI_Send MPI_Recv 段错误

c++ - 使用时间单位模板返回 chrono::duration 的函数

c++ - 创建 GStreamer XUL 元素?

c++ - 编写 scons 脚本来处理许多子目录中文件的编译

c++ - 将结构数组传递给 pthread_create

c++ - 在 C 和 C++ 中通过指针访问结构

c++ - C 到 C++ 指针数组的转换问题

c++ - 设置 ITEMWriter 写入 4K 视频

c++ - 为什么这个 time_zone_ptr 示例不包含内存泄漏?

c++ - 头文件中定义的多个结构 - 我应该将它们移出单独的 h 和 cpp 文件吗