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

9

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

有谁可以帮我吗?


6
很可能是为了与等效的C接口保持一致性。 - WhiZTiM
1
@WhiZTiM 但是,std::atomic是一个类模板,为什么它需要与C一致? - Caesar
1
这并不是严格要求,而是为了方便程序员,使其不必记住另一个无意义的差异。你只需要记住,atomic_load 接受一个指针,无论你传递的基本类型是什么。 - Matteo Italia
1个回答

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:C中的_Generic宏可以处理不同的参数类型,但不能处理变化的函数形式。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接