これ:
typedef int& ref;
const ref error;
あなたが思っていることをしません。代わりに検討してください:
typedef int* pointer;
typedef const pointer const_pointer;
のタイプconst_pointerはint* const、ではありません const int *。つまり、const T「Tが不変であるタイプを作成する」と言っている場合。したがって、前の例では、ポインター(ポインターではない)は不変になっています。
参照することはできませconstんvolatile。これ:
int& const x;
は無意味なので、参照にcv-qualifiersを追加しても効果はありません。
したがって、errorタイプはint&です。に割り当てることはできませんconst int&。
コードには他にも問題があります。たとえば、これは確かに間違っています。
template<class t>
t const& check()
{
return t(); //return a temporary object
}
ここで行っているのは、関数が。を返すときにその存続期間を終了する一時オブジェクトへの参照を返すことです。つまり、referandにオブジェクトがないため、これを使用すると未定義の動作が発生します。これは次のようなものに勝るものはありません。
template<class t>
t const& check()
{
T x = T();
return x; // return a local...bang you're dead
}
より良いテストは次のようになります。
template<class T>
T check()
{
return T();
}
関数の戻り値は一時的なものであるため、一時的なものを定数参照に実際にバインドできるかどうかをテストできます。