zee*_*lor 5 c++ templates implicit-conversion
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); ...
但是,更高版本的编译器(和库?)成功编译了此用法。
我几乎是一个 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该库是 Dinkum 库的专有版本。)
我需要了解如何支持模板函数的调用,例如
std::atomic_fetch_char (&ch, 5)参数类型与模板声明中的参数类型不完全匹配的情况。例如,我想了解 Linux/usr/include/c++/11/标准库如何支持这一点。
我自己想到的最接近的方法是添加std::atomic_fetch_add()类似函数的各种实例化的非模板重载,但我没有看到 Linux/GNU C++ 库中这样做,我怀疑有一种更干净的方法。我想理解它。
最初要求第二个参数与原子对象std::atomic_fetch_add具有相同的类型,因为这两个参数都参与了类型推导。value_type
缺陷报告P0558R1删除了这一点,以便推导仅发生在原子对象上,并且第二个参数仅转换为differece_type原子对象的 。
您收到错误是因为旧版本没有使用此缺陷报告进行修补,但较新版本却进行了修补。