Portuje pewien kod z linuksa na windowsa i natknąłem się na ciekawą rzecz. Mam zestaw helperów opakowujących typy z biblioteki napisanej w C w unique_ptr
. W uproszczeniu te helpery funkcjonalnie sprowadzają się do tego:
struct Type {};
void deleter(Type* t) {if(t) delete t;}
template<>
inline auto make_unique(Type *raw) -> std::unique_ptr<Type, decltype(&deleter)>
{
return std::unique_ptr<Type, decltype(&deleter)> (std::forward<Type*>(raw),
std::forward<decltype(&deleter)>(deleter));
}
No i okej, std::forward
wstawiony bardziej z rozpędu niż z potrzeby bo zawsze dostanie lvalue
. Ale ktoś tak napisał i w sumie nikomu nie przeszkadza. Ani clang ani gcc nie protestuje.
Tymczasem VC++ 2015
no instance of overloaded function "std::forward" matches the argument list
argument types are: (void(Type *t))
Czy byłby ktoś tak miły i mi wytłumaczył dlaczego VC++ nie może sobie wyspecjalizować std::forward
dla deletera? Bo po całym dniu walki z linkerem to już sam nie wiem, czy psikusa robi mi VC++ czy problem leży między klawiaturą a krzesłem.