1

次の2つのプロトタイプについて考えてみます。

template<class T>
void whatever1(const T& something);

template<class T>
void whatever2(T const& something);

それらは両方とも同一です。しかしT、通常の型ではなく、ポインタ型の場合はどうでしょうか。たとえば、そうすると、異なる解釈になりますTSomewhere*whatever1whatever2

// 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

4

4 に答える 4

3

テンプレートがインスタンス化されるときの T の Somewhere* への置換は、テキストのものではありません。そのため、どちらの場合も、const はポインターに適用され、ポインターが指すものには適用されません。

于 2012-04-09T22:06:00.440 に答える
3

constそのように、修飾子を名前付き型に挿入することはできません。簡単な例として、次の場合:

typedef int* P;
const P x;

次にx、タイプint* constではなくconst int*です。は、型の一部だけでなく、型const全体に適用されます。同じことがテンプレート型パラメーターにも当てはまります。PP

修飾子を型に挿入したい場合は、やconstのような型特性を使用するなどして、あまり問題なく実行できます。remove_pointeradd_const

于 2012-04-09T22:06:47.400 に答える
3

あなたの仮定は間違っています。When T = U *、 thenT const &およびconst T &は両方ともU * const &であり、それだけです。同様に、const TT constは両方U * constであり、T = const Wの場合T *W const *またはconst W *です。(もちろん、これはすべて参照の折りたたみ規則の対象となるため、どちらも参照型でもないと仮定しUますW)。

于 2012-04-09T22:08:39.753 に答える
1

どちらも同じです。しかしT、 が通常の型ではなくポインター型である場合はどうなるでしょうか。たとえば、let Tbe Somewhere*thenwhatever1whatever2別の解釈になります。

// 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);

いいえ、実際にはそうではなくvoid whatever1(const Somewhere*& something);void whatever1(const (Somewhere*)& something);無効な C++ のようなコードになります。それを書くC++の方法はあなたwhatever2のものですが、それらは同じことを意味します。

于 2012-04-09T22:08:29.193 に答える