次の2つのプロトタイプについて考えてみます。
template<class T>
void whatever1(const T& something);
template<class T>
void whatever2(T const& something);
それらは両方とも同一です。しかしT
、通常の型ではなく、ポインタ型の場合はどうでしょうか。たとえば、そうすると、異なる解釈になりますT
。Somewhere*
whatever1
whatever2
// nonconst pointer (passed by reference) to const object
void whatever1(const Somewhere*& something);
// const pointer (passed by reference) to nonconst object
void whatever2(Somewhere* const& something);
この場合、次のプロパティを推測できます。
1 whatever1
:
a)something
内部を変更でき、これらの変更は外部に伝播します。
b)が指すオブジェクトはsomething
変更できません。
2 whatever2
:
a)something
内部を変更できないため、外部で安全です。
b)が指すオブジェクトはsomething
変更できます。
通常const
、と&
は、パラメータを渡すときにコピーを回避し、同時にこのパラメータを変更から保護するために一緒に使用されます。そして、この哲学に関しては、whatever2
その役割を果たすだけです。ただし、が指すオブジェクトsomething
も変更できないようにする場合は、2つのうちどちらも適切ではありません。では、何でしょうか?多分このジョーク:
template<class T>
void whatever3(const T const& something);
この混乱に加えて、スタイルを使用する人whatever1
もいれば、スタイルを使用する人もいますwhatever2
。経験則として、ジェネリッククラスとメソッドを作成するときにどちらを使用する必要がありますか?
物事がさらに混乱するようにSomewhere**
考え始めると、注意してください。T