Mi sono appena reso conto che il tentativo di ottenere il tipo di ritorno di una funzione tramite decltype non implica ADL (argomento-dipendente-ricerca) su VS2012 (testato utilizzando cl.exe V17.00.60610.1).Nessun ADL interno in decltype su VS2012
L'esempio seguente
#include <stdio.h>
#include <typeinfo>
namespace A {
int Func(void const *) {
printf("A::Func(void const *)\n");
return 0;
}
template <typename T> void Do(T const &t) {
Func(&t);
}
template <typename T> void PrintType(T const &t) {
printf("Type: %s\n", typeid(decltype(Func(&t))).name());
}
}
namespace B {
struct XX { };
float Func(XX const *) {
printf("B::Func(XX const *)\n");
return 0.0f;
}
}
int main(int argc, char **argv) {
B::XX xx;
A::Do(xx);
A::PrintType(xx);
return 0;
}
Dà
B::Func(XX const *)
Type: int
su VS2012
ma (cosa ci si aspetta):
B::Func(XX const *)
Type: f
su gcc 4.7.3.
Quindi ADL funziona quando si chiama la funzione (riga 1 in uscita) ma non quando viene utilizzata all'interno di decltype su VS2012.
O mi manca qualche punto diverso?
VS2012 Il supporto 'decltype' è piuttosto scarso (cercare" espressione SFINAE "e piangere), quindi non sono poi così sorpreso. – Yakk
molte funzionalità di C++ 11 erano molto di qualità alfa in VS2012 e nel successivo CTP di novembre. Presumibilmente c'è una lunga lista di bug risolti nell'anteprima VS2013 (Express attualmente disponibile per il download). Potresti tentare la fortuna lì. – TemplateRex
Quindi, per quanto riguarda il nuovo modo di aggiornamenti molto frequenti per risolvere bug e aggiungere nuove funzionalità che MS voleva seguire dal VS2012 ... Quindi cosa ... fortunatamente non ho restrizioni nella selezione del compilatore in questo specifico progetto, quindi tutte le mie speranze e i sogni sono puntati su VS2013 :-) – mmmmmmmm