7

参照名または変数名のいずれかを取る関数をオーバーロードできますか?

たとえば、これをやろうとすると:

void function(double a);
void function(double &a);

この関数の呼び出し元ができるようにしたい:

double a = 2.5;
function(a); // should call function(double &a)
function(2.3); // should call function(double a)

メモリの使用を改善し、スコープ外の変数を操作できるようにするために、参照渡し関数を作成したいと思いますが、関数を呼び出すためだけに新しい変数を作成する必要はありません。

これは可能ですか?

乾杯

4

6 に答える 6

9

ここで要点を見逃していると思います。あなたが本当に持っているべきものはこれだけです:

void function(const double &a);

「定数」に注意してください。これにより、常に参照渡しを取得する必要があります。非 const 参照渡しがある場合、コンパイラは、渡されたオブジェクトを変更したいと正しく想定します。これはもちろん、値渡しバリアントとは概念的に互換性がありません。

const 参照を使用すると、コンパイラは喜んで一時オブジェクトを作成します。コンパイラはこれらの一時オブジェクトを「const」オブジェクトとしてのみ作成できるため、非 const バージョンは機能しません。

于 2010-07-12T10:01:41.667 に答える
1

やってみたけどダメだった

少なくとも MSVC2008 では、これは不可能です。これはすべての c++ コンパイラに当てはまると思います。

定義自体は有効ですが、関数を呼び出そうとすると

function(a);

パラメーターとして変数を使用すると、コンパイラーが使用する関数を決定できないため、コンパイラー・エラーが発生します。

于 2010-07-12T10:00:17.880 に答える
1
void function(double const &a);  // instead of void function(double a);
void function(double       &a); 
于 2010-07-12T10:22:10.203 に答える
0

ほとんどの場合(常に?)レジストリで渡されるため、PODタイプを参照で渡すことの利点はありません。const参照によって渡される複雑な型(複数のPOD変数で構成される型)は、通常(常に?:D)コピーおよびスタックプッシュよりも好ましい方法です。明示的なコンストラクターを作成することで、POD型から複合型変数の一時変数の作成を制御することもできます。

于 2010-07-12T12:22:03.610 に答える
0

私は定義を考えていません:

void function(double a);
void function(double &a);

可能です...コンパイラはどの関数を呼び出すかをどのように知るのでしょうfunction(x)か? 参照と値の両方で使用する場合は、2 つの異なる関数を使用する必要があります。これにより、このあいまいなオーバーロードよりもコードが読みやすくなります。

于 2010-07-12T09:56:39.540 に答える
-1

いいえ、これを行うことはできません。両方の関数が同じマングル名を効果的に生成し、リンカーは関数呼び出しを解決できません。

于 2010-07-12T10:17:10.053 に答える