Występuje problem z gcc z C++ 14. Podczas kompilacji kodu poniżej pojawia się błądWyszukiwanie argumentu w C++
"call of overloaded ‘make_unique(std::__cxx11::string)’ is ambiguous"
Jednak jeśli usunąć lokalną definicję make_unique ja też pojawia się błąd:
"‘make_unique’ was not declared in this scope"
wydaje się, że powinno to być niemożliwe, aby oba te błędy, ponieważ albo std :: make_unique jest wciągana z powodu ADL, albo nie. Czy to tylko problem z gcc, czy jest coś innego?
Dla odniesienia sub-code make_unique dla funkcji szablonowej innej niż szablon (np. Pozycja) pozbywa się błędu "nie jest zadeklarowany w tym zakresie", co prowadzi mnie do przekonania, że jest to problem z gcc.
#include <string>
#include <memory>
template <typename T, typename... Args>
inline std::unique_ptr<T> make_unique(Args&&... args)
{
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
struct A
{
A(std::string a){ }
};
int main()
{
auto a = make_unique<A>(std::string());
}
FWIW, clang i MSVS2017 również odrzucają kod z tego samego powodu. – NathanOliver
Dziwne ... Myślałem, że ADL nie ma zastosowania do wywołań z jawnymi argumentami szablonu? – ildjarn
Patrz [P0389R0] (http://wg21.link/p0389r0). – cpplearner