小编zee*_*lor的帖子

为什么较新的编译器开始接受此模板函数调用?

std::atomic_fetch_add()对于低于 9.0 的 x86-64 clang 版本和低于 9.1 的 gcc 版本,以下涉及调用模板函数的小型 C++ 程序无法在 godbolt 中编译,在这两种情况下都使用该--std=c++11选项。

#include <iostream>
#include <atomic>

std::atomic<char> ch ('@');

int main ()
{
    std::atomic_fetch_add (&ch, 5);
    std::cout << ch << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

在那些早期的编译器版本中(它可能与编译器提供的 C++ 库更相关,我不确定),调用std::atomic_fetch_add (&ch, 5); 无法匹配原子获取函数的任何模板专门化,因为chis的类型char和类型是:5int

:在函数“int main()”中::8:34:错误:没有匹配的函数可调用“atomic_fetch_add(std::atomic*, int)”std::atomic_fetch_add (&ch, 5); ...

但是,更高版本的编译器(和库?)成功编译了此用法。

  1. 是什么改变了这个开始编译?
  2. 如果是标准库更改,则使用什么技术来实现这一点?
  3. C++ 标准(以及什么版本?)是否要求这种用法应该有效。

我几乎是一个 C++ 初学者,但我认为这与在确定要使用的适当模板专业化过程中未执行隐式转换有关。(我可能没有使用精确的语言。)

我知道我可以通过将其重写为来修改对工作的调用

std::atomic_fetch_add<char> (&ch, 5);
Run Code Online (Sandbox Code Playgroud)

或者

std::atomic_fetch_add (&ch, (char)5);
Run Code Online (Sandbox Code Playgroud)

但是,我有兴趣获得一个版本的<atomic>库来支持使用,而无需显式实例化和强制转换。(编译器是 clang 15.0.0,--std=c++11该库是 …

c++ templates implicit-conversion

5
推荐指数
1
解决办法
87
查看次数

标签 统计

c++ ×1

implicit-conversion ×1

templates ×1