我使用过的所有 C++ 运算符都会返回一些东西,例如+
运算符返回加法的结果。
是否所有 C++ 运算符都返回某些内容,或者是否有一些 C++ 运算符不返回任何内容?
Adr*_*ica 113
虽然他们也有可能不是正好你在想什么,注意delete
和delete[]
C ++“关键字”实际上是运营商; 并且它们被定义为具有void
返回类型 - 这意味着它们的评估结果为零(这不是“某物”)。
Run Code Online (Sandbox Code Playgroud)void operator delete ( void* ptr ) noexcept; void operator delete[]( void* ptr ) noexcept;
for*_*818 82
自定义类型的运算符可以被重载来做最奇怪的事情。
例如 + 运算符返回加法的结果。
不必要:
#include <iostream>
struct foo {
int value = 0;
void operator+(int x) {
value += x;
}
};
int main () {
foo f;
f + 3;
}
Run Code Online (Sandbox Code Playgroud)
此处operator+
将左侧添加到value
成员中,其返回类型为 void。这是一个虚构的示例,但一般来说,不从自定义运算符返回某些内容并不罕见。
我知道,唯一可以重载并且需要返回某些内容的运算符是operator->
. 它必须返回一个原始指针或一个带有operator->
.
Sto*_*ica 34
挑剔,运营商不返回任何东西。它们只是我们用来在语言中创建表达式的词汇元素。现在,表达式具有类型并且可以评估为值,我认为这就是您所说的运算符“返回事物”的意思。
而且,嗯,是的。有带有类型的 C++ 表达式void
(因此不计算任何值)。有些是显而易见的,有些则不那么明显。一个很好的例子是
throw std::runtime_error()
Run Code Online (Sandbox Code Playgroud)
throw
是 C++ 语法下的表达式。您可以在其他表达式中使用它,例如在条件表达式中
return goodStatus() ? getValue() : throw std::runtime_error();
Run Code Online (Sandbox Code Playgroud)
而 throw 表达式的类型是void
。显然,由于这只会导致执行快速转到其他地方,因此该表达式没有任何价值。
Bat*_*eba 21
内置的 C++ 运算符都不返回任何内容。重载的 C++ 运算符返回一些东西,因为运算符符号是函数调用的语法糖。
相反,运营商都评估某事。那个东西有一个明确定义的value和一个type。甚至函数调用运算符void operator()(/*params*/)
也是一种void
类型。
例如,+'a'
是在您的平台上int
具有'a'
编码值的类型。
如果您的问题是“C++ 运算符可以有void
返回类型吗?” 那么答案肯定是肯定的。
眠りネ*_*ネロク 13
您实际上可以定义一个函数调用运算符来不返回任何内容。例如:
struct Task {
void operator()() const;
};
Run Code Online (Sandbox Code Playgroud)
dfr*_*fri 11
您可以定义特殊的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()!
}
Run Code Online (Sandbox Code Playgroud)
[...]从未使用转换函数将(可能是 cv 限定的)对象转换为(可能是 cv 限定的)相同对象类型(或对它的引用),或(可能是 cv 限定的)基类该类型的(或对它的引用),或到(可能是 cv 限定的)
void
。117( 117 ) 出于重载解析([over.best.ics]、[over.ics.ref])以及初始化([dcl.init])和显式强制转换的目的,这些转换被视为标准转换。转换为
void
不调用任何转换函数([expr.static.cast])。即使从未直接调用来执行转换,也可以声明此类转换函数,并且可以通过调用基类中的虚拟转换函数来潜在地访问它们。
然而,如上所示,您仍然可以使用显式.operator void()
语法调用它。
小智 5
语言定义(内置)的运算符是用于执行不同类型计算的标记:
等等。该列表可能非常广泛。
在像这样或这样的语言引用中,这些不一定被引用为返回某些东西,只是执行算术或逻辑运算,通过比较可以修改变量等。
由于此操作会产生一些值,因此可以将其解释为运算符“返回”,但它与函数返回值不同。
另一方面,重载运算符可以定义为某种类型的返回值,即使可以是 void,因此,并非所有运算符都在 C++ 中返回某个值。
归档时间: |
|
查看次数: |
8017 次 |
最近记录: |