Clang und GCC (mit Ausnahme von MSVC) können ein Vorlagenargument nicht auflösen, wenn es als Argument für die Vorlagenfunktion std::addressof<int>
übergeben wird. Das Folgende ist ein Beispiel für einen solchen Fehler:Warum kann das Template-Argument nicht von std :: addressof <int> aufgelöst werden?
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)
^
GCC:
/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>);
^
Dieser Fehler würde Sinn machen, wenn das Argument war stattdessen ein std::addressof
, weil die UnaryOperator
Template-Parameter wäre mehrdeutig. Allerdings muss der Compiler nicht ableiten, was T
ist in std::addressof<int>
, würde ich hier keine Zweideutigkeit.
Hier ist ein funktionierendes Beispiel für meine Erwartungen (auf Clang kompiliert 5 und 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);
}
Mein Zweifel ist: Warum kann Template-Argument von std::addressof<int>
abgeleitet werden nicht std::transform
s?
Wissen Sie, welcher Vorschlag das geändert hat? –
http://wg21.link/lwg2598 – Brian