C ++为什么atomic_load的参数类型是指针而不是引用?

时间:2017-09-19 12:01:29

标签: c++ c++11 stl language-lawyer

我同意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;
                                   ^

任何人都可以帮助我吗?

1 个答案:

答案 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。)