c++中为一个操作数重载二进制操作符
Overloading a binary operator for one operand in c++
能否在c++中重载一个二元操作符,使其只接受一个操作数?
我试着用一个类似的类来实现这个:
#include <iostream>
using namespace std;
class IntWrap {
public:
IntWrap operator=(int rhs) {
val = rhs;
return *this;
}
// No second operand for +
IntWrap operator+() {
IntWrap result;
result = val + 1;
return result;
}
int Val() {return val;}
private:
int val;
};
这段代码实际上是用GCC编译的,这让我很惊讶,它甚至没有给-Wall
任何警告
我遇到的问题实际上是使用重载操作符。
不能编译,因为GCC需要在+
后面有一个操作数:
int main() {
IntWrap test;
test = 0;
test +; // GCC expects an operand after +
return 0;
}
成员函数可以与test.operator+()
一起使用,但这并不真正使用操作符。
所以更具体地说,重载一个只有一个操作数的二进制操作符是c++标准允许的吗?如果是这样,是否有可能使用操作符表示法调用重载函数,可能是通过对右操作数使用某种虚拟值?
另外,别担心,我不打算在任何实际代码中使用这个,我只是好奇,因为我找不到关于这个的任何东西
在c++中能否重载一个二元操作符,使其只接受一个操作数?
不,你不能那样做。操作符重载不允许更改语言的语法或操作符优先级。它只允许您更改使用操作符时发生的情况。
你用
做了什么IntWrap operator+() { ... }
重载一元+
操作符
你应该能够使用:
IntWrap test;
test = 0;
+test;
您重载的不是二进制操作符,而是unary +
操作符。正确的用法是
IntWrap test;
test = 0;
+test;
N4140 [over.oper]/6:
不能更改操作符的优先级、分组、或操作数的数目。
在你的代码中,你重载了一元+
运算符,而不是二进制的。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 一元*运算符的操作数是否期望一个 prvalue
- 将具有相反操作数的两个函数重构为一个
- 我收到一个错误无效的操作数,类型为 const char [42] 和二进制"运算符+"的双倍数
- 我会遇到一个错误:作为左派分配的操作数所需的lvalue
- 为什么一个运算符的操作数需要具有相同的类型
- 基操作数具有非指针类型,但它是一个指针
- C ++,得到一个"没有运算符">>"匹配这些操作数"。对于读取文件的函数
- 为什么在未赋值的操作数内进行包扩展会导致最后一个元素
- 如何使操作符的左操作数<<一个函数
- LLVM:创建一个带有空指针操作数的CallInst
- c++中为一个操作数重载二进制操作符