0

copy-ctorクラスのとを宣言しoperator= privateて、そのオブジェクトをコピー不可にし、両方の定義を提供しません。クラスがこれらのオブジェクトをfriends呼び出すと、エラーが発生しますよね?copying behaviorlink-time

class A
{
    public:
        ...

    private:
        A(const &a);
        A& operator=(const &a);  //just declarations, no definitions
};

しかし、エラーを から に移動するためにlink-timecompile-time私は本からこれを行うことができることを学びました:

class UnCopyable
{
    public:
        ...

    private:
        Uncopyable(const &u);
        Uncopyable& operator=(const &u);  //also no definitions
};

次にA継承させUncopyable

class A: private Uncopyable
{
    ...
};

そして、誰かが でコピーを呼び出した場合、A最初に のコピー相手をA呼び出す必要がありますが、とはプライベートであるため、これは失敗し、 で発生するエラーが発生します。UncopyableUncopyablecopy-ctoroperator=compile-time

私の質問は、なぜそれが起こるのcompile-timeですか?

4

1 に答える 1

2

言語のセマンティクスの違反はコンパイル時エラーであるのに対し、リンク時エラーは宣言されている関数に起因するエラーですが、リンカーはその定義を見つけることができないためです。

つまり、リンカ エラーは、プログラムが有効な C++ プログラムであり、リンカが他のコンパイル ユニット内の関数への参照をパッチするリンク段階に達したことを意味します (コンパイラは一度に 1 つのコンパイル ユニットしか考慮しないため)。どこでも検索しましたが、定義が見つかりません。コンパイル時エラーは、プログラムが何らかの形で C++ の規則に違反していることを意味します。

ただし、あなたの仮定は少し間違っています。を作成すると、それらのオブジェクトを割り当てようとする人にコンパイル時エラーが発生しますoperator= private リンカー エラーが発生するのは、関数がそのクラスのプライベート関数 (friend関数またはメンバー関数など)アクセスする場合のみであり、リンカー エラーが発生します。

于 2012-05-07T02:38:02.733 に答える