投稿した例では、2つの構文に違いはありません。彼らは完全に同一です。
違いがある場合が2つあります。 1つは、テンプレート引数に依存する型から継承するテンプレートクラスがある場合です。例:ここでは
template <typename T> class Base {
public:
void doSomething() const {
std::cout << "Do ALL the things!" << std::endl;
}
};
template <typename T> class Derived: public Base<T> {
public:
void doSomethingElse() const {
doSomething(); // Error!
this->doSomething(); // Okay
}
};
は、テンプレート引数に依存タイプBase<T>
、からDerived<T>
継承しているので、名前の検索は、2段階のプロセスで行われます。修飾されていない構文を使用してdoSomething
を呼び出すと、コンパイラはBase<T>
を調べてエラーを報告します。しかし、this->doSomething()
と言うと、メンバー関数を呼び出していて、最終的にそれがBase<T>
であるとわかっていることがわかります。
他のケースは、メンバー関数と同じ名前の関数内で宣言されたローカルオブジェクトがある場合です。たとえば:
class ThisIsSillyDontDoThisLikeSeriouslyDont {
public:
void doSomething() const {
std::cout << "Do ALL the things!" << std::endl;
}
void weirdFunction() const {
auto doSomething = [] {
std::cout << "I'm afraid there's nothing to be done" << std::endl;
};
doSomething(); // Calls the local function
this->doSomething(); // Calls the member function
}
};
この第二のケースでは、私はそれを見たことがないほど稀であり、私はそれが本当に貧しいコーディングスタイルだと言うように遠くに行くと思います。
ただし、これらのまれなケースの他に、this->
の有無にかかわらず、自分自身でメンバー関数を呼び出すことには違いがありません。
完全に文章です。 – user4581301