返回void的预增量操作符
pre increment operator that returns void
以下代码在gcc
和clang
中都可以编译:
class A{
public:
void operator++(){
printf("A++n");
// return *this;
}
};
不"正确"实现这种操作符的方法是:
class A{
public:
A &operator++(){
printf("A++n");
return *this;
}
};
void
版本是黑客吗?我从来没见过这样的语法。谷歌搜索只返回一篇关于它的IBM教育论文。
为什么这不是广泛使用的方式来实现预增量返回self引用
为什么这不是广泛使用的方式来实现预增量返回self引用。
如果你问为什么它是预增量没有这个签名,而不是返回一个左值引用到它所应用的对象,这是因为它被设计为求值到一个表达式,这样它就可以以与内置类型相同的方式使用:
int i = 42;
int j = ++i;
A a;
A b = ++a; // Error if RHS is void
(++a).doSomething(); // ditto
此外,前缀++
(和--
)的预期语义是它们返回对(修改过的)对象的左值引用。
你当然可以这样写,它会做你想做的。但是有一个通用的设计原则,重载操作符应该以与'int'类似的方式工作,以避免让用户感到惊讶。
人们希望能够写
A a;
B b = ++a;
因为这就是预增量通常的工作方式,并且会对编译器错误感到惊讶,这会给你的类。没有技术上的原因可以解释为什么你不能让它做一些不同的事情,就像你可以让operator +为你的类做减法一样,如果你真的想要。
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 在c++类上调用void函数
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 在派生函数中指定void*参数
- C++为什么尽管我调用了void函数,它却不起作用
- 如何从void函数输出字符串
- 我应该使用什么来代替void作为变体中的替代类型之一
- 奇怪的结构&GCC&clang(void*返回类型)
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 引用一个已擦除类型(void*)的指针
- 将尾部调用void(i32,..)位转换为llvm::函数以获取FnAttribute
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- 如何将指针从一个void函数传递到另一个C++
- 为什么我在使用void函数时得到错误代码C2276
- void*到驱动程序中的UnicodeString
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- 返回void的预增量操作符
- 使用delete操作符删除void指针
- 为什么将操作符void*()转换函数添加到c++流类中