이 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
'program tip' 카테고리의 다른 글
USB로 연결된 Android 모바일 장치에서 PC의 로컬 호스트에 액세스 (0) | 2020.11.12 |
---|---|
내 로그가 std 네임 스페이스에있는 이유는 무엇입니까? (0) | 2020.11.12 |
iPhone 애플리케이션을 AppStore에 업로드하는 단계 (0) | 2020.11.12 |
로그인 요청 인증 토큰 문제 (0) | 2020.11.12 |
다중 작업 트레이에서 앱이 중지되면 Android 앱에서 Firebase 알림을받지 못함 (0) | 2020.11.12 |