我使用过的所有C ++运算符都返回某些内容,例如,该+
运算符返回加法的结果。
是所有C ++运算符都返回什么,还是有些C ++运算符不返回任何东西?
我使用过的所有C ++运算符都返回某些内容,例如,该+
运算符返回加法的结果。
是所有C ++运算符都返回什么,还是有些C ++运算符不返回任何东西?
+=
return void
,但是不建议这样做。函数调用运算符也可以返回void
,这是有效的
::
不返回任何内容,但是我必须参考标准来确保。
Answers:
尽管它们可能不完全是您所想的,但请注意,delete
和delete[]
C ++的“关键字”实际上是运算符;它们被定义为具有void
返回类型-它们其中的手段评价到什么(这是不是“东西”)。
来自cppreference:
void operator delete ( void* ptr ) noexcept;
void operator delete[]( void* ptr ) noexcept;
delete
,delete[]
,throw
,(void)x;
铸造,左侧,
的操作者,右侧,
操作员的收益率void
,一个?:
一个使用三元throw
的臂中的一个,dfri的operator void()
(定义这将是用户),眠りネロク的void operator()()
(这将是用户定义的)。
delete
操作员先销毁对象然后调用,这也令人困惑operator delete
。因此,delete
运算符Ergooperator delete
是分开的事情:( stackoverflow.com/a/8918942/845092
operator delete
。
自定义类型的运算符可以重载以执行最奇怪的事情。
例如,+运算符返回加法的结果。
不必要:
#include <iostream>
struct foo {
int value = 0;
void operator+(int x) {
value += x;
}
};
int main () {
foo f;
f + 3;
}
此处operator+
将左侧添加到该value
成员,并且其返回类型为void。这是一个虚构的示例,但总的来说,不从自定义运算符返回任何内容并不罕见。
我知道,唯一可以重载并且需要返回某些内容的运算符是operator->
。它必须返回原始指针或具有的对象operator->
。
operator->
有点特殊,它需要返回一个指针或一个对象,该对象具有一个operator->
,不确定是否还有其他异常
operator*(Matrix const& left, Matrix const& right)
不返回Matrix
,而是返回MatrixMul
,这样,如果将其馈送到operator+(Matrix const& left, MatrixMul const& right)
运算中,则可以进行融合的乘加运算,它比先乘后加运算的效率更高。
<<
和>>
被I / O操作重载时,它们将返回流,以便您可以对其进行级联:stream << foo << bar;
对于nitpick,操作员不返回任何东西。它们只是我们用来创建语言表达的词汇元素。现在,表达式具有类型并且可以求值。我假设这就是运算符“返回事物”的意思。
而且,是的。有C ++表达式具有类型void
(因此不求任何值)。有些很明显,有些则不然。一个很好的例子是
throw std::runtime_error()
throw
是C ++语法下的一个表达式。您可以在其他表达式中使用它,例如在条件表达式中
return goodStatus() ? getValue() : throw std::runtime_error();
而throw表达式的类型是void
。显然,由于这只会导致执行迅速转到其他位置,因此该表达式没有任何价值。
内置C ++运算符均未返回任何内容。只要运算符符号是函数调用的语法糖,重载的C ++运算符就会返回某些内容。
相反,操作员都对某事进行评估。某些东西具有明确定义的值和类型。甚至函数调用运算符void operator()(/*params*/)
也是一种void
类型。
例如,+'a'
是在平台上int
具有已'a'
编码值的类型。
如果您的问题是“ C ++运算符可以有void
返回类型吗?” 那么答案肯定是肯定的。
I++
不返回值。如果类型i
是用户定义的类型,则该表达式将实现为operator++
,这是一个返回值的函数。您称其为“语法糖”;我称这种区分具有重要的后果。
您实际上可以定义一个函数调用运算符,以不返回任何内容。例如:
struct Task {
void operator()() const;
};
您可以定义特殊的operator void()
转换函数,编译器甚至会警告您永远不要使用T
tovoid
转换函数:
#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()
语法来调用它。
由语言定义(内置)的运算符是用于执行各种计算的令牌:
等等。该列表可能非常广泛。
在像语言的引用这一个或这一个,这些并不一定为返回的东西,只是执行算术运算或逻辑引用操作,通过这意味着变量的比较可以被修改,等
由于此操作会产生某些值,因此可以将其解释为由操作员“返回”,但它不同于函数返回值。
另一方面,可以使用某种类型的返回值来定义重载的运算符,即使该返回值也可以是无效的,因此,不,并非所有运算符都在C ++中返回某些值。
否。在这里考虑以下两个示例:
int multiply (int a, int b) {
return a*b;
}
void multiply_void(int a, int b) {
cout << a*b;
//or cout << multiply(a,b);
}
第一个函数将返回一个整数值,该值可以被另一个函数使用。该值将返回并存储在内存中,以便在必要时使用。如果不是,则它对人类是不可见的,并且只是快乐地坐在内存中。
第二个功能将输出到默认输出设备(通常是控制台)。乘法运算符返回的值将传递到输出设备。函数multiple_void不返回实际值。
操作员自己不一定返回任何东西。函数调用返回值。运算符可以产生值。操作员有时可以调用函数。示例包括:
•函数调用运算符。
•重载的运算符,将其转换为函数调用。
•作为new-expression的一部分调用的operator new是函数调用。
我提到函数调用的唯一目的是弄清楚结果与返回。通过查看[expr]中的所有126个“ return”实例及其派生的单词,该节似乎谨慎地使用单词return来指代:
•函数调用的结果
•与协程相关的控制流程的各个方面
好的,这足以说明结果与回报。
C ++运算符是否返回某些内容取决于您如何使用它们。内置C ++运算符将返回一些值,直到除非被强制返回void。