私が使用したすべてのC ++演算子は何かを+
返します。たとえば、演算子は加算の結果を返します。
すべてのC ++演算子は何かを返しますか、それとも何も返さないC ++演算子がありますか?
私が使用したすべてのC ++演算子は何かを+
返します。たとえば、演算子は加算の結果を返します。
すべてのC ++演算子は何かを返しますか、それとも何も返さないC ++演算子がありますか?
+=
、returnを実装できますがvoid
、これはお勧めしません。また、関数呼び出し演算子が戻ることができvoid
、これは有効です
::
が何も返さないという予感がありますが、確認するために標準を参照する必要があります。
回答:
それらはおそらくあなたが考えているものとは正確には一致しませんがdelete
、delete[]
C ++の「キーワード」は実際には演算子であることに注意してください。そして、それらはvoid
戻り値の型を持つものとして定義されています-つまり、何も評価されません(これは「何か」ではありません)。
cppreferenceから:
void operator delete ( void* ptr ) noexcept;
void operator delete[]( void* ptr ) noexcept;
delete
、delete[]
、throw
、(void)x;
キャスト、左側,
演算子の右側,
得演算子void
、?:
使用する三元throw
腕の1のために、dfriのoperator void()
(ユーザが定義することになる)、眠りネロクさんvoid operator()()
(ユーザが定義されます)。
operator delete
。
カスタムタイプの演算子は、最も奇妙なことを行うためにオーバーロードすることができます。
たとえば、+演算子は加算の結果を返します。
必ずしも:
#include <iostream>
struct foo {
int value = 0;
void operator+(int x) {
value += x;
}
};
int main () {
foo f;
f + 3;
}
ここでoperator+
左側をに追加しますvalue
メンバーにその戻り値の型は無効です。これは作り上げられた例ですが、一般に、カスタム演算子から何かを返さないことは珍しいことではありません。
オーバーロードされる可能性があり、何かを返す必要がある唯一の演算子は、私が知っていることですが、です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;
ちょっとしたことですが、演算子は何も返しません。これらは、言語で式を作成するために使用する単なる語彙要素です。さて、式には型があり、値に評価される可能性があります。これが、「物を返す」演算子の意味だと思います。
そして、まあ、はい。タイプを持つ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()!
}
[class.conv.fct] / 1によって管理されます
[...]変換関数を使用して、(おそらくcv修飾された)オブジェクトを(おそらくcv修飾された)同じオブジェクトタイプ(またはその参照)、(おそらくcv修飾された)基本クラスに変換することはありません。そのタイプ(またはそれへの参照)の、またはに(おそらくCV修飾)
void
。117(117) これらの変換は、過負荷解決([over.best.ics]、[over.ics.ref])、したがって初期化([dcl.init])および明示的なキャストを目的とした標準変換と見なされます。への変換
void
は、変換関数([expr.static.cast])を呼び出しません。変換を実行するために直接呼び出されることはありませんが、そのような変換関数は宣言でき、基本クラスの仮想変換関数を呼び出すことで到達できる可能性があります。
ただし、上記のように、明示的な.operator void()
構文を使用して呼び出すことができます。
言語によって定義された(組み込みの)演算子は、さまざまな種類の計算を実行するために使用されるトークンです。
等々。リストは非常に広範囲に及ぶ可能性があります。
以下のような言語リファレンスでは、この1またはこのいずれか、これらは必ずしも単なる算術及び論理行い、何かを返すように参照されていない操作を、変数を意味することで比較が修正されてもよい、等
この演算は何らかの値をもたらすため、演算子によって「返される」と解釈される場合がありますが、関数の戻り値とは異なります。
一方、オーバーロードされた演算子は、無効になる可能性がある場合でも、何らかのタイプの戻り値で定義できます。したがって、すべての演算子がC ++で何らかの値を返すわけではありません。
いいえ。ここで次の2つの例を検討してください。
int multiply (int a, int b) {
return a*b;
}
void multiply_void(int a, int b) {
cout << a*b;
//or cout << multiply(a,b);
}
最初の関数は、別の関数で使用できる整数値を返します。値が返され、必要に応じて使用できるようにメモリに保存されます。そうでなければ、それは人間には見えず、ただ幸せに記憶の中に座っています。
2番目の関数は、デフォルトの出力デバイス(通常はコンソール)に出力します。乗算演算子によって返された値は、出力デバイスに渡されます。関数multiply_voidは実際の値を返しません。
オペレーター自身は必ずしも何も返しません。関数呼び出しは値を返します。演算子は値になります。オペレーターは関数を呼び出すことができます。例は次のとおりです。
•関数呼び出し演算子。
•関数呼び出しに変換されるオーバーロードされた演算子。
• new-expressionの一部として呼び出される演算子newは、関数呼び出しです。
関数呼び出しについて言及する私の唯一の目的は、結果と戻り値を明確にすることです。[expr]で「return」の126のインスタンスすべてとそれから派生した単語を調べることに基づいています、このセクションではreturnという単語を注意深く使用して次のことを参照しているようです。
•関数呼び出しの結果
•コルーチンに関連する制御フローの側面
OK、それは結果対リターンの十分な衒学者です。
C ++演算子が何かを返すかどうかは、それらをどのように使用したかによって異なります。組み込みのC ++演算子は、voidを返すように強制されない限り、何らかの値を返します。