-2

&a = &bのような代入が C++ で許可されていない理由を知りたいです。

そうすることのリスクは理解していますが、少なくとも私にとっては、それを完全に禁止する十分な理由にはなりません. 私がそれについて考えた理由は、コピーせずに大きなオブジェクトを交換するスマートな方法を探していたからです。

void ptr_swap( ptrdiff_t &a, ptrdiff_t &b )
{
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
}

int main()
{
    double a = 157648.13;
    double b = 96871.84;

    printf("%.4f %.4f\n", a, b);

    ptr_swap( reinterpret_cast<ptrdiff_t>(&a), reinterpret_cast<ptrdiff_t>(&b) );

    printf("%.4f %.4f\n", a, b);
}

..しかし、明らかに、コンパイラはそうは考えていません。:(

編集:これが機能しない理由を理解しています。多分私の質問は次のように明確になるでしょう: プログラム内で変数がいくつのプロパティを持っているかはわかりませんが、少なくとも名前、値、アドレス、およびおそらくその寿命の兆候です。問題は、私にとって、スワッピングは本質的にメモリに保存されている 2 つの既存の値の名前を変更することであり、コピーが発生することはナンセンスです。

そこであきらめたこの「恐ろしい」コード例で、私がやろうとしているのは、コンパイラーに「これからは、b は a という名前になり、その逆も同様です」と言うことです。なぜそんなことが出来ないのでしょうか?動機は、たとえば TMP を介して、ある意味で「コンパイラに指示する」ことがすでに可能であるということです。

4

5 に答える 5

9

オブジェクトのアドレスを変更したいようですね。それは不可能です。すべてのオブジェクトは、その存続期間全体にわたって固定アドレスを持っています。オブジェクトに別のアドレスを与えることはできません。オブジェクトのアドレスは、生成されたマシン コードに暗黙的に含まれており、それ自体はどこにも格納されていません。

于 2012-12-05T19:40:06.000 に答える
3

&結果として値を持つ演算子です。値に何かをどのように割り当てますか? 例:

int i, n;
i + n = 50;
于 2012-12-05T19:28:18.500 に答える
2

あなたの質問の上から始めて:

Why are pointers obtained by the address-of operator not lvalues?

c99規格によると、

ISO : c99 6.5.3.2 Address and indirection operators

セマンティクス

3
The unary & operator yields the address of its operand. If the operand has type ‘‘type’’, the result has type ‘‘pointer to type’’. If the operand is the result of a unary * operator, neither that operator nor the & operator is evaluated and the result is as if both were omitted, except that the constraints on the operators still apply and the **result is not an lvalue**.

一時的であることは、オブジェクトのプロパティです。オブジェクトの参照を作成すると、それは一時的なものであり、他の変数に対して同じものを再定義することはできません。

今あなたの場合、あなたがしたことはそうではありpassing by addressませんpassing by reference。変数を渡すだけでよいため、呼び出し環境にはpass by reference必要ありません。&

単に次のようにします:

 swap(a,b); // calling

void swap(int &a, int &b)
{
 // definition 
 // here a and b are reference.
}
于 2012-12-05T19:32:22.217 に答える
2

これを行う方法は他にもたくさんあります。これは、スマート ポインターを使用して完全に行うことができます。

于 2012-12-05T19:32:26.833 に答える
1

オブジェクトはメモリ内の場所です。
変数名は、オブジェクトの参照です(プログラム内のオブジェクトを参照する方法)。ただし、すべての変数に名前があるわけではありません。

ただし、変数にエイリアスを渡すことで、目的を達成できます。

void print(double& ref1, double& ref2)
{
    printf("%.4f %.4f\n", ref1, ref2);
}
int main()
{
    double a = 157648.13;
    double b = 96871.84;

    print(a, b);    
    print(b, a); // Pass them the function the other way around.
                 // You have effectively swapped the values (as far as the function is concerned).
}

私のオプションでは、あなたは存在しない問題を解決しようとしています。

于 2012-12-05T21:42:06.110 に答える