2017-09-19 18 views
8

Yanıtı When to use references vs. pointers kabul ediyorum.
Ama merak ediyorum neden C++ C++ atomic_load parametresinin türü referans yerine neden işaretçidir?

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

yerine

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

Herkes bana yardımcı olabilir

olarak atomic_load tanımlar?

+6

Büyük olasılıkla C arayüzü] (http://en.cppreference.com/w/c/atomic/atomic_load). – WhiZTiM

+0

@WhiZTiM Ancak, std :: atomic bir sınıf şablonudur, neden C ile tutarlı olmasını gerektirir? – Caesar

+1

Kesinlikle gerekli değildir, henüz bir başka anlamsız farkı hatırlamak zorunda kalmayan programcı için bir kolaylık. Sadece atomic_load'un tam olarak hangi baz türünden geçtiğine bakılmaksızın bir işaretçi aldığını hatırlamanız gerekir. –

cevap

10

biz hiç bu serbest fonksiyon şablonları sebebi C11 ile kaynak uyumluluk geçerli:

#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 başvuruları yoktur.

Buna ihtiyacınız yoksa, c.load() veya T dolaylı dönüşümü iyi çalışır. Sadece özgür fonksiyonun var olduğunu unutun.

(serbest fonksiyonu şablonu memory_order sürümü atomic_load_explicit denir nedeni de budur. Argüman türleri değişen, ancak Arity değişen değil işleyebilir C _Generic Destekli makro) [eşdeğer bütünlüğü için

İlgili konular