gpt4 book ai didi

c++ - 为什么不能从 std::addressof 解析模板参数?

转载 作者:行者123 更新时间:2023-11-30 01:06:36 25 4
gpt4 key购买 nike

Clang 和 GCC(MSVC 除外)在模板参数传递时无法解析 std::addressof<int>作为模板函数的参数。以下是此类错误的示例:

std::vector<int> v{1,2,3,4,5};
std::vector<int*> pv(iv.size());
std::transform(v.begin(), v.end(), pv.begin(), std::addressof<int>);

clang :

<source>:8:5: error: no matching function for call to 'transform'
std::transform(iv.begin(), iv.end(), piv.begin(), std::addressof<int>);
^~~~~~~~~~~~~~
/opt/compiler-explorer/clang-5.0.0/bin/../include/c++/v1/algorithm:2028:1: note: candidate template ignored: couldn't infer template argument '_UnaryOperation'
transform(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _UnaryOperation __op)
^

海湾合作委员会:

/opt/compiler-explorer/gcc-7.2.0/include/c++/7.2.0/bits/stl_algo.h:4295:5: note:   template argument deduction/substitution failed:
<source>:8:74: note: could not resolve address from overloaded function 'addressof<int>'
std::transform(iv.begin(), iv.end(), piv.begin(), std::addressof<int>);
^

如果参数是 std::addressof,那么这个错误就有意义了,因为 UnaryOperator模板参数将是模棱两可的。但是,编译器不需要推断出什么 Tstd::addressof<int> , 我在这里不会含糊不清。

这是我期望的一个工作示例(在 Clang 5 和 GCC 7.2 上编译):

template <typename T>
T* addrof(T& a)
{
return __builtin_addressof(a);
}

template <typename F, typename T>
void foo(F f, T& a)
{
f(a);
}

int main()
{
int a = 42;
foo(addrof<int>, a);
}

我的疑问是:为什么不能std::transform s 模板参数从 std::addressof<int> 推导出来?

最佳答案

是的,它在您的示例中不起作用,因为自 C++ 17 以来,每个模板 std::addressof 都有两个重载(一个获取地址,一个删除的版本采用右值引用) ,编译器选择哪一个是不明确的。最简单的解决方案是使用 lambda:

#include <vector>
#include <algorithm>

void foo() {
std::vector<int> v{1,2,3,4,5};
std::vector<int*> pv(v.size());
std::transform(v.begin(), v.end(), pv.begin(),
[](int& i) { return std::addressof(i);});
}

此处列出了这些重载:http://en.cppreference.com/w/cpp/memory/addressof

另一种选择是使用转换,但它很丑,你应该更喜欢 Lambdas!然而,将提供完整性:

#include <vector>
#include <algorithm>

void foo() {
std::vector<int> v{1,2,3,4,5};
std::vector<int*> pv(v.size());

std::transform(v.begin(), v.end(), pv.begin(),
static_cast<int* (*)(int&) >(std::addressof<int>));
}

关于c++ - 为什么不能从 std::addressof<int> 解析模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46183945/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com