7

なぜこれがコンパイルされるのか、誰かが知っていますか??

template< typename TBufferTypeFront, typename TBufferTypeBack = TBufferTypeFront>
class FrontBackBuffer{

public:


  FrontBackBuffer(
    const TBufferTypeFront  front, 
    const TBufferTypeBack back):    ////const reference  assigned to reference???
     m_Front(front),
     m_Back(back)
  {
  };

  ~FrontBackBuffer()
  {};

  TBufferTypeFront m_Front;       ///< The front buffer
  TBufferTypeBack m_Back;         ///< The back buffer

};

int main(){
    int b;
    int a;
    FrontBackBuffer<int&,int&> buffer(a,b); //
    buffer.m_Back = 33;
    buffer.m_Front = 55;
}

GCC 4.4 でコンパイルします。これをコンパイルできるのはなぜですか?const 参照を非 const 参照に割り当てることができないというエラーがあってはいけませんか?

4

4 に答える 4

13

タイプが の場合Tint&タイプconst Tconst int&ではなくint & constです。参照の不正な最上位の const は、テンプレートの置換と typedef の結果では無視されます。

一方、 が のT場合const intT&const int&

于 2012-11-07T16:11:36.830 に答える
5

TypeBufferFront がの場合int&const TBufferTypeFrontは と同等ですint& const。ここで、参照先が定数でなくても、すべての参照が定数であるため、テンプレート置換中に const は無視されます。

したがって、 でインスタンス化するとint&、コンストラクターは効果的FrontBackBuffer(int&, int&)に になり、指定どおりに機能します。

これは、多くの人が のT const代わりにを使用const Tして、置換がどのように発生するかを明確にし、cv 修飾子を右から左に読めるようにする理由の例です。

于 2012-11-07T16:11:46.837 に答える
2

For the code to do what you want it to do, it would have to read:

  FrontBackBuffer(
    typename std::remove_reference<TBufferTypeFront>::type const&  m_front, 
    typename std::remove_reference<TBufferTypeBack>::type const& m_back):    ////const reference  assigned to reference???
    m_Front(m_front),
    m_Back(m_back)
  {
  };

which has the added "feature" that it turns other types into const references when used to construct FrontBackBuffer.

Now this isn't perfect. This prevents temporary arguments to FrontBackBuffer from being moved, and passes even small cheap to copy types (like char) by reference instead of by value. There are standard C++0x techniques to do this that are a bit awkward to write if you care.

于 2012-11-07T16:24:42.493 に答える
0

FrontBackBuffer::m_Frontテンプレートのインスタンス化TBufferTypeFrontで変換されるタイプです。int&への代入に問題はありませんint&

于 2012-11-07T16:11:56.800 に答える