我同意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;
^
任何人都可以帮助我吗?
答案 0 :(得分: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
的原因:_Generic
- C中的驱动宏可以处理不同的参数类型,但不能改变arity。)