1

以下に示す式で、一時的に const の型が想定されているかどうかは不明です。

#include <iostream>

class X {
public:
X(int a) { i = a; cout << "X(int) [" << (int)this << "]" << endl; }

X& operator+(const X& x) 
{ 
i += x.i; 
cout << "X operator+(const X&) [" << (int)this << "]" << endl; 
return *this; 
}

~X() { cout << "~X [" << (int)this << "]" << endl; }

private:
int i;
};


int main() 
{
X x = X(3) + X(4);
cout << "done" << endl;

return 0;
}

X(3)非 const のように動作します ( を呼び出すことができるためoperator+、一方、X(4)const のように動作します ( には const 引数が必要なためoperator+)。

誰かが明確にすることができますか、正しい理解とは何ですか?

4

4 に答える 4

2

const一時的なメンバー以外の人に電話をかけることができます。constただし、非参照を一時的なものにバインドすることはできません。

于 2011-11-16T09:11:17.607 に答える
2

クラス型に関しては、const型の一時を作成すると、その一時はconstになります。また、非const型の一時を作成すると、その一時は非constになります。それでおしまい。つまり、正確なタイプに関する限り、constとtemporariesの間にまったく関係はありません。クラス型のTemporaryは、それ自体でconstを想定することはありません。明示的にconstを課すことができるのはあなたです。

あなたの例では、netherX(3)X(4)constでもありません。はconstではないためX(3)、const以外のメソッドを呼び出すことができます。

あなたのX(4)「constとして振る舞う」と言うのは正しくありません。あなたの例では、それが「constとして動作する」という兆候はまったくありません。const参照を何かで初期化できたからといって、それがconstであることを意味するわけではありません。

あなたの質問では、あなたは「でconst引数が必要」と述べていますoperator+。それは正しくありません。にconst引数は必要ありませんoperator+パラメータ はconstx参照として宣言されています。const参照は、const引数および非const引数に簡単にバインドできます。あなたの場合、const参照パラメーターxは非const一時引数にバインドされていますX(4)

于 2011-11-16T09:11:26.450 に答える
2

歴史的に、一時変数は右辺値であり、右辺値は cv 修飾されていません (また、修飾することもできません)。この規則は、非クラス型、またはメンバー関数を持たないクラス型に対してうまく機能しました。const-ness は関数オーバーロードの解決に介入するため、テンポラリーの cv-qualification を維持する必要があります。関数が単にXを返す場合、一時的なものは const ではなく、非 const 関数を呼び出すことができます。関数が を返す場合X const、一時的なものは const であり、const 以外の関数を呼び出すことはできません。原則として、クラス型をconst;として返すことがおそらく望ましいでしょう。つまりX const f()、むしろX f(). しかし、間違いなく例外があり、それがより適切な場合であっても、誰もそれを行いません. 最後に、const-ness を指定できないコンテキスト (関数スタイルの型変換など) があります。この場合、構文は cv 修飾子を指定する手段を提供しません (typedef を使用する場合を除く)。

次のコードの出力を確認することをお勧めします。

class C
{
    std::string myComment;
public:
    C( std::string const& comment ) : myComment( comment ) {}

    void f()
    {
        std::cout << "Non const " << myComment << std::endl;
    }

    void f() const
    {
        std::cout << "Const " << myComment << std::endl;
    }
};

typedef C const CC;

C
c()
{
    return C("function return value");
}

C const
cc()
{
    return C("function return value");
}

int
main()
{
    C("function style conversion").f();
    CC("function style conversion").f();
    c().f();
    cc().f();
}
于 2011-11-16T10:02:55.057 に答える
1

次のコードでは:

X x = X(3) + X(4);

X(3)を呼び出す一時的なnon-constオブジェクトを作成し、関数へのconst参照引数として別の一時的なnon-constオブジェクトをoperator+渡します。X(4)

非constオブジェクトをconstオブジェクトとして関数に渡すことはできますが(参照渡し)、constオブジェクトをnon-const参照で関数に渡すことはできません。それが違いです。

于 2011-11-16T09:12:26.653 に答える