小编ja2*_*142的帖子

原子函数指针调用可以在 gcc 中编译,但不能在 clang 和 msvc 中编译

当从原子函数指针调用函数时,例如:

#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]:错误:对“std::atomic<func_type>”类型的对象的调用(又名“atomic<int (*)()>”)不明确
  • [msvc]:有不止一种方法可以为参数列表调用“std::atomic<func_type>”类型的对象

Clang 还指定了可能的候选调用:

  • operator __pointer_type() const noexcept
  • operator __pointer_type() const volatile noexcept

看起来这种波动性的差异对于 clang 和 msvc 来说是令人困惑的,但对于 gcc 却不是。

f()当 call从改为 时f.load()(),代码可以在所有上述编译器中运行。这更令人困惑,因为据说load()和都有和重载 - 如果隐式转换不起作用,我预计也不会起作用。隐式转换(与成员调用)中的规则是否有所不同?operator T()constconst volatileload()

那么,gcc 接受该代码是错误的吗?clang和msvc错误会报错吗?还有其他错误或正确的组合吗?


这主要是一个理论问题,但如果有更好的方法来拥有原子函数指针,我想知道。

c++ atomic language-lawyer stdatomic

18
推荐指数
1
解决办法
1082
查看次数

标签 统计

atomic ×1

c++ ×1

language-lawyer ×1

stdatomic ×1