いくつかのコードサンプルを見てみましょう:
! 4 > 0;
C++ 標準から、比較よりも否定が最初に行われることがわかっています。しかし、この例を少し拡張すると、次のようになります。
#include <iostream>
class Test
{
public:
bool operator!() const
{
std::cout << "operator!" << std::endl;
return false;
}
bool operator>(const int &) const
{
std::cout << "operator>" << std::endl;
return false;
}
};
int main(int argc, char * argv[])
{
Test t;
std::cout << "t > 0;" << std::endl;
t > 0;
std::cout << "! t > 0;" << std::endl;
! t > 0;
std::cout << "!t.operator>(0)" << std::endl;
! t.operator>(0);
return 0;
}
このプログラムの出力は次のようになります。
t > 0;
operator>
! t > 0;
operator!
!t.operator>(0)
operator>
- 最初の呼び出し (制御呼び出し) は非常に明確です。必要なオペレーターが呼び出されているかどうかを確認します。
- 2 回目の呼び出しは、私が最初に述べたことの証明です。否定演算子が最初に呼び出され、結果 (bool) operator> が呼び出されます。
- 3回目の電話は私を悩ませているものです。
そして、ここで私の質問が飛び出します。SomeObjInstance > 0
call が と異なる理由SomeObjInstance.operator>(0)
。2 番目の方法で (メンバーとして) オペレーターを呼び出すことは一般的ではないことはわかっていますが、なぜこの呼び出しが異なるのでしょうか? メンバー演算子が存在しない場合、内部でSomeObjInstance > 0
メンバー呼び出しSomeObjInstance.operator>(0)
または関数呼び出しに変換されると常に考えていました。bool operator>(const Test &, int)
この動作はC++標準で説明されている場所ですか、それとも未定義の動作ですか?