「関数受信値」(#A)よりも「関数受信参照」(#B)を優先する方法を教えてください。あいまい:f(A&)オーバーロードの優先度をf(A)
#include <iostream>
using namespace std;
class Heavy{/* ...... */}; //a complex class
Heavy generateHeavy(){
return Heavy();
}
void f(Heavy x){ //#A I want LOW priority.
std::cout<<"case 1: pass by value"<<std::endl;
}
void f(Heavy& x){ //#B I want HIGH priority. (save CPU for big object)
std::cout<<"case 2: pass by reference"<<std::endl;
}
int main() {
//vvvv Here is existing code base that I don't want to touch.
f(generateHeavy()); //compiler call case 1 -> ok (I prefer reference, though)
Heavy heavy;
f(heavy); //should call case 2, but compiler fail (ambiguous) <= question
return 0;
}
この問題は、SFINAEを可能な限り参照渡しが望ましい実際のケースに拡張しようとする最初の試みから来ています。
「Heavy」オーバーロードを「Heavy &&」で置き換える必要があります。 – StoryTeller
@StoryTeller良い点。したがって、(時々)それを使用するときstd :: move()を呼び出さなければなりませんか?申し訳ありませんが、私は言及を忘れて、私は多くの既存のコードベースに触れたくありません。 – javaLover
必ずしもそうではありません。また、Heavy(existing_heavy)というコピーで呼び出すこともできます。全体のポイントは、デフォルトでコピーを作成しないようにすることです。 – StoryTeller