2

const 参照変数を関数の const 参照パラメーターに渡しても、関数パラメーターが "被参照型の const 参照の const 参照"型にならないことはわかっています。const 参照引数の変数名は、レフリーの別のエイリアスとして扱われるだけですが、そのエイリアスを使用してレフリーを変更できないという保護が与えられています。

参照変数の名前が参照変数のエイリアスであるかのように使用されるという考え方は、変数にうまく適用され間接的な別のレイヤーが提供されます。以下の類似のアイデアを適用することは意味がないように思われます。

  • const 参照型自体がその参照先ののエイリアスであるかのように使用されている、
  • その参照先ののエイリアスとして使用されているconst 参照型typedefの a 、
  • テンプレート パラメーターがであり、その関数パラメーターが である場合、パラメーターに渡される (またはtemplateパラメーターによって推定される) const 参照変数は、その型がその参照の型として解釈されます。typename TT const&

しかし、それは次のように発生するようです。

#include <typeinfo>
#include <iostream>

template <typename T>
T const& min(T const& a, T const& b) {
    std::cout << typeid(a).name() << std::endl;
    std::cout << typeid(b).name() << std::endl;
    return a < b ? a : b;
}

int main() {
    int x = 6, y = 7;
    int const& rx = x;
    std::cout << typeid(rx).name() << std::endl;           // "int"
    int z = ::min(rx, y);       //output shows both "a" and "b" are of type "int"
    std::cout << z << std::endl;                           // “6”
    typedef int const& icr;
    std::cout << typeid(icr).name() << std::endl;          // "int"
    std::cout << typeid(int const&).name() << std::endl;   // "int"
}
  1. なぜ関数テンプレートは、既に になっている引数に対しても機能するのint const&ですか? (サンプルコードではint const&、第一引数に変数、第二引数に変数を指定した呼び出しでも動作しました。) C++では「参照の参照」がint許されないので無効なのではないでしょうか?

  2. typeidの代わりname()int const&_ int const&_ int_

  3. そうでない場合、この意味int const&int;のエイリアスではないでしょうか。どちらも異なる型 (変数の名前ではない) であるため、意味がありません。

  4. 変数名に戻ると、次のようになります。

    int num = 8;
    int const& ref = num;
    std::cout << typeid(ref).name() << std::endl;
    

    なぜ出力intではなく、なぜint const&ですか?

4

2 に答える 2

3
  1. sと同様に、型推論のコンテキストでは参照が折りたたまれているためconstです。参照の崩壊を調べてください。すでに多くの回答があります。

  2. いいえ、参照は透過的であるため、見ることはできません。参照である変数に名前を付けると、言語は常に参照者を意味すると見なします。参照の場合、typeidまたはconstそれを無視する場合。

  3. variableのような重要でない単語を太字にしないでください。質問が読みにくくなります :)

于 2013-12-12T23:55:33.197 に答える