5

次のコードを検討してください。

#include <iostream>
#include <functional>

using namespace std;

template<class T>
void fun(T t) 
{ 
    t+=8;
}


int main()
{
    int i = 0;
    fun(ref(i));
    cout << i << endl;
}

このコードは「8」を出力します。fun()のtは自動的にint&に変換されると思います。

しかし、に置き換えるt+=8t=8、プログラムはコンパイルされません。

なんで?

4

1 に答える 1

3

reference_wrapper<T>には暗黙の変換演算子があります。そのため、aが。よりも一致する場所T &に変換されます。T &T &reference_wrapper<T>

拡張代入式では、実行可能な演算子はであるint &operator+=(int &, int)ため、int &が抽出されます。

代入式では、メンバー演算子reference_wrapper<int>::operator=(const reference_wrapper<int> &)も使用できるため、メンバー演算子が優先されます。次に、コンパイラは定数から参照ラッパーを作成しようとし8ますが、失敗します。代入演算子には、tie期待どおりに機能するような施設に必要な再バインドの効果があります。

これは、参照ラッパーがC++参照よりもPythonなどの言語の参照に近いことを意味します。

#include <functional>
#include <iostream>

int main() {
    int i = 1, j = 2;
    std::ref(i) = j;
    std::cout << i << '\n';                 // prints '1'
}
于 2012-11-22T18:13:35.197 に答える