soword科技言
永久公益免费API接口
提供永久免费的API接口,查看更多API接口,如果您有其他免费API资源,请联系我们,造福人类。
提供商务开发:小程序,系统,APP
定制开发,免费评估,免费咨询,价格便宜,售后保障,前往开发服务中心联系开发客服中心
所有C ++运算符都返回什么吗?

我使用过的所有C ++运算符都返回一些内容,例如,该+运算符返回加法的结果。

是所有C ++运算符都返回什么,还是有些C ++运算符不返回任何东西?

不,并非所有操作员都会返回某些东西。

虽然他们也有可能不是正好你在想什么,注意deletedelete[]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返回类型吗?” 那么答案肯定是肯定的。

运算符void():用户定义的转换 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()!}

根据[class.conv.fct] / 1的规定

[...] 永远不会使用转换函数将(可能具有cv限定)对象转换为(可能具有cv限定)相同对象类型(或对其的引用),转换为(可能具有cv限定)对象基类该类型(或对它的引用)的,或(可能CV-合格) void117

117 出于过载解析([over.best.ics],[over.ics.ref])以及初始化([dcl.init])和显式强制转换的目的,这些转换被视为标准转换。到的转换void不会调用任何转换函数([expr.static.cast])。即使从未直接调用过执行转换,也可以声明此类转换函数,并有可能通过对基类中的虚拟转换函数的调用来实现。

但是,如上所述,您仍然可以使用显式.operator void()语法来调用它

您实际上可以定义一个函数调用运算符,以不返回任何内容。例如:

struct Task {
 void operator()() const;};

由语言定义(内置)的运算符是用于执行各种计算的令牌:

  • 算术(+,-,*,/)

  • 增量/减量(++,-)

  • 赋值(=,+ =,-=,* =,/ =,%=,>> =,<< =,&=,^ =,| =)

  • 逻辑(!,&&,||)

  • 关系(==,!=,>,<,> =,<=)

  • 有条件的?

  • 逗号

等等。该列表可能非常广泛。

在像语言的引用这一个这一个,这些并不一定为返回的东西,只是执行算术运算或逻辑引用操作,通过这意味着变量的比较可以被修改,等

由于此操作会产生某些值,因此可以将其解释为由操作员“返回”,但它与函数返回值不同。

另一方面,可以使用某种类型的返回值来定义重载的运算符,即使该返回值也可以是空的,因此,不是的,不是所有的运算符都在C ++中返回某些值。



2023-03-22 10:04:19

新人小程序+APP定制199元起


发放福利,助力中小企业发展,真正在互联网中受益

点击询问定制

广告服务展示