我使用过的所有C ++运算符都返回一些内容,例如,该+
运算符返回加法的结果。
是所有C ++运算符都返回什么,还是有些C ++运算符不返回任何东西?
虽然他们也有可能不是正好你在想什么,注意delete
和delete[]
C ++“关键字”实际上是运营商 ; 并且它们被定义为具有void
返回类型-这意味着它们的计算结果为空(不是 “某物”)。
来自cppreference:
void operator delete( void* ptr ) noexcept;void operator delete[]( void* ptr ) noexcept;
自定义类型的运算符可以重载以执行最奇怪的事情。
例如,+运算符返回加法的结果。
不必要:
#include <iostream>struct foo { int value = 0; void operator+(int x) { value += x; }};int main () { foo f; f + 3;}
此处operator+
将左侧添加到该value
成员,并且其返回类型为void。这是一个虚构的示例,但是总的来说,不从自定义运算符返回内容并不罕见。
我知道,唯一可以重载并且需要返回某些内容的运算符是operator->
。它必须返回原始指针或具有的对象operator->
。
对于nitpick,操作员不返回任何东西。它们只是我们用来创建语言表达的词汇元素。现在,表达式具有类型并且可以求值。我假设这就是运算符“返回事物”的意思。
而且,是的。有C ++表达式具有类型void
(因此不会求值)。有些很明显,有些则不然。一个很好的例子是
throw std::runtime_error()
throw
是C ++语法下的一个表达式。您可以在其他表达式中使用它,例如在条件表达式中
return goodStatus() ? getValue() : throw std::runtime_error();
抛出表达式的类型为void
。显然,由于这只会导致执行迅速转到其他位置,因此该表达式没有任何价值。
内置C ++运算符均未返回任何内容。只要操作符表示法是函数调用的语法糖,重载的C ++运算符就会返回某些内容。
相反,操作员都对某事进行评估。某些东西具有明确定义的值和类型。甚至函数调用运算符void operator()(/*params*/)
也是一种void
类型。
例如,+'a'
是在平台上int
具有已'a'
编码值的类型。
如果您的问题是“ C ++运算符可以有void
返回类型吗?” 那么答案肯定是肯定的。
您可以定义特殊的operator void()
转换函数,编译器甚至会警告您永远不要使用T
to void
转换函数:
#include <iostream>struct Foo { operator void() { std::cout << "Foo::operator void()!"; } // warning: conversion function converting 'Foo' to //'void' will never be used}; int main() { Foo f; (void)f;// nothing f.operator void();// Foo::operator void()!}
[...] 永远不会使用转换函数将(可能具有cv限定)对象转换为(可能具有cv限定)相同对象类型(或对其的引用),转换为(可能具有cv限定)对象基类该类型(或对它的引用)的,或至(可能CV-合格)
void
。117(117) 出于过载解析([over.best.ics],[over.ics.ref])以及初始化([dcl.init])和显式强制转换的目的,这些转换被视为标准转换。到的转换
void
不会调用任何转换函数([expr.static.cast])。即使从未直接调用过执行转换,也可以声明此类转换函数,并有可能通过对基类中的虚拟转换函数的调用来实现。
但是,如上所述,您仍然可以使用显式.operator void()
语法来调用它。
您实际上可以定义一个函数调用运算符,以不返回任何内容。例如:
struct Task { void operator()() const;};
由语言定义(内置)的运算符是用于执行各种计算的令牌:
算术(+,-,*,/)
增量/减量(++,-)
赋值(=,+ =,-=,* =,/ =,%=,>> =,<< =,&=,^ =,| =)
逻辑(!,&&,||)
关系(==,!=,>,<,> =,<=)
有条件的?
逗号
等等。该列表可能非常广泛。
在像语言的引用这一个或这一个,这些并不一定为返回的东西,只是执行算术运算或逻辑引用操作,通过这意味着变量的比较可以被修改,等
由于此操作会产生某些值,因此可以将其解释为由操作员“返回”,但它与函数返回值不同。
另一方面,可以使用某种类型的返回值来定义重载的运算符,即使该返回值也可以是空的,因此,不是的,不是所有的运算符都在C ++中返回某些值。