当从原子函数指针调用函数时,例如:
#include <atomic>
#include <type_traits>
int func0(){ return 0; }
using func_type = std::add_pointer<int()>::type;
std::atomic<func_type> f = { func0 };
int main(){
f();
}
Run Code Online (Sandbox Code Playgroud)
gcc 根本不抱怨,而 clang 和 msvc 在调用方面有问题f():
Clang 还指定了可能的候选调用:
operator __pointer_type() const noexceptoperator __pointer_type() const volatile noexcept看起来这种波动性的差异对于 clang 和 msvc 来说是令人困惑的,但对于 gcc 却不是。
f()当 call从改为 时f.load()(),代码可以在所有上述编译器中运行。这更令人困惑,因为据说load()和都有和重载 - 如果隐式转换不起作用,我预计也不会起作用。隐式转换(与成员调用)中的规则是否有所不同?operator T()constconst volatileload()
那么,gcc 接受该代码是错误的吗?clang和msvc错误会报错吗?还有其他错误或正确的组合吗?
这主要是一个理论问题,但如果有更好的方法来拥有原子函数指针,我想知道。