2017-09-19 3 views
8

나는 대답을 When to use references vs. pointers에 동의합니다.
그러나, 나는 궁금 왜 C++은 atomic_load의 매개 변수 유형이 참조 대신 포인터 인 이유는 무엇입니까?

template<class T> 
T atomic_load(const std::atomic<T> *obj) noexcept; 
           ^

대신

template<class T> 
T atomic_load(const std::atomic<T> &obj) noexcept; 
           ^

이 사람이 나를 도울 수

로 atomic_load을 정의?

+6

대부분의 경우 C 인터페이스] (http://en.cppreference.com/w/c/atomic/atomic_load)를 참조하십시오. – WhiZTiM

+0

@WhiZTiM하지만 std :: atomic은 클래스 템플릿이며 왜 C와 일관성이 필요합니까? – Caesar

+1

엄격하게 요구되는 것은 아니며, 또 다른 무의미한 차이점을 기억할 필요가없는 프로그래머에게 편리합니다. 'atomic_load'가 정확하게 전달하는 기본 유형에 관계없이 포인터를 취한다는 것을 기억하면됩니다. –

답변

10

우리 모두에서이 자유로운 기능 템플릿이 이유는 C11과 소스 호환성입니다 :

#ifdef __cplusplus 
#include <atomic> 
#define _Atomic(X) std::atomic<X> 
#else 
#include <stdatomic.h> 
#endif 

_Atomic(int) c; 

int get_c(void) { 
    return atomic_load(&c); 
} 

C는 언급이 없습니다.

필요하지 않은 경우 c.load() 또는 T으로의 암시 적 변환이 정상적으로 작동합니다. 자유로운 기능이 존재했다는 것을 잊어 버려라.

(자유 함수 템플릿의 memory_order 버전이 atomic_load_explicit라고하는 이유는 다음과 같습니다. 인수의 형태를 변화하지만, arity에 변화하지 처리 할 수있는 C에서 _Generic -powered 매크로)에서 [동등한 균일

관련 문제