1

Visual Studio Professional 2012 を使用しています。クラス (ヘッダーとソース) を正常にプリコンパイルしました。数日後、前のクラスを利用している別のクラス (当面はヘッダーのみ) をコンパイルすると、コンパイラーは欠落している参照if(this != &rhs)とセミコロンをキャッチしました。rhs.root = nullptr;.

おそらくそれは私の素朴さとコンパイラがどのように機能するかについての知識の欠如ですが、コンパイラはこれらのようなエラーをキャッチするのに堅牢であると思いました. 特定のコード ブロックが必要な場合にのみ、コンパイラはそれをチェックする必要があると感じました。

ジャストインタイム コンパイルについて読んで、アセンブリ コンパイラが最初にシンボルを使用し、次に構文を使用して 2 パス コンパイルを実行する方法を学びました。私は自分の大学でコンパイラ構築のコースを受講したことがなく、そのようなコースがパーサーなどについての優れた洞察を提供してくれることを知っています。

エラーをキャッチできなかったコード セクションは、次の移動代入演算子です。

Tree &operator=(Tree &&rhs) 
{ 
    if(this != rhs)    <--------- no reference to the rhs
    { 
        root = std::move(rhs.root); 
        rhs.root = nullptr      <----------- no semicoln
    } 
    return *this; 
}

ブースト バリアントとビジター クラス メンバーのコンパイル中にエラーが生成されました。

bool operator() (Tree<std::string>& tree) const {
    return tree.load(tree);
}

ブーストのシリアライゼーションに関連する他の多くのエラーと同様に。もちろん、修正は欠落している参照とセミコロンを修正することでしたが、コンパイラがこのコードに触れる必要がある場合にのみ、これが明らかにキャッチされた理由を理解したいですか?

4

1 に答える 1

2

テンプレートクラスですか?

テンプレートのセマンティック分析は、テンプレートがインスタンス化された場合にのみ意味があるためです。つまり、テンプレートの場合、コンパイラはセミコロンの欠落 (構文エラー) でエラーを生成する必要がありますが、== 演算子では生成しません。

次のコードは g++ でコンパイルされます。

template<typename T>
struct A {
        void q(A &a) {
                if (this == a) {}
        }

};

int main(int argc, char **argv) {
        A<int> x;
        //x.q(x);
}

しかし、いつコンパイルされません

        x.q(x);

はコメント解除されています。

于 2013-03-28T13:36:54.233 に答える