program tip

이 std :: ref 동작이 논리적입니까?

radiobox 2020. 11. 12. 08:05
반응형

이 std :: ref 동작이 논리적입니까?


이 코드를 고려하십시오.

#include <iostream>
#include <functional>

int xx = 7;

template<class T>
void f1(T arg)
{
    arg += xx;
}

template<class T>
void f2(T arg)
{
    arg = xx;
}

int main()
{
    int j;

    j=100;
    f1(std::ref(j));
    std::cout << j << std::endl;

    j=100;
    f2(std::ref(j));
    std::cout << j << std::endl;
}

이 코드를 실행하면

107
100

두 번째 값이 100이 아니라 7이 될 것으로 예상했을 것입니다.

내가 무엇을 놓치고 있습니까?


f2단서 제공 하는 작은 수정 :

template<class T>
void f2(T arg)
{
    arg.get() = xx;
}

이제 예상대로 작동합니다.

이것은 객체를 std::ref반환 하기 때문에 발생했습니다 std::reference_wrapper<>. 랩퍼 를 리 바인드 하는 할당 연산자입니다 . ( http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper/operator%3D 참조 )

래핑 된 참조에 할당하지 않습니다.

에서 f1경우, 모두가이 때문에 예상대로 작동 std::reference_wrapper<T>에 변환 연산자 제공 T&의 암시 오른쪽에 바인딩, int암시들 operator+.


reference_wrapper has operator = and a non explicit constructor, see documentation.

So, even if it is surprising, it is the normal behaviour:

f2 rebinds the local reference_wrapper to xx.


arg = xx;

Local arg now refers to (read as binds with) xx. (And no more refers to j)

arg += xx;

Implicit operator T& () is applied to match the argument of operator += and hence addition is performed on referred object i.e. j.

So the observed behaviour is correct.

참고URL : https://stackoverflow.com/questions/37101301/is-this-stdref-behaviour-logical

반응형