8

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; 
} 

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?

+2

VS2012 Il supporto 'decltype' è piuttosto scarso (cercare" espressione SFINAE "e piangere), quindi non sono poi così sorpreso. – Yakk

+0

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

+0

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

risposta

2

Un test case minima è:

namespace N 
{ 
    struct C {}; 

    C f(C) {}; 
} 

N::C c1; 

decltype(f(c1)) c2; 

Se il compilatore non supporta ADL all'interno decltype, quindi quanto sopra vi non compilazione.

Mi è stato detto che viene compilato, quindi forse è l'interazione tra ADL e l'istanziazione del modello che è il problema.

+0

Se 'c1' è dichiarato con lo spazio dei nomi' N :: C c1; e 'c2' come funzione (poiché MSVS non accetta una variabile di tipo' void'), compila. – Pixelchemist

+0

@Pixelchemist: risolto, grazie. Se MSVS lo compila, msvs non ha un problema con ADL all'interno di decltype in almeno alcuni casi. –

2

Se trovi divertente che l'IDE/Intellisense sembra eseguire correttamente la ricerca ma il compilatore no.

Questo esempio non mostra errori intellisense e a viene visualizzato come di tipo size_t quando si passa il mouse su di esso.

#include <iostream> 
namespace A 
{ 
    struct C {}; 
    size_t f(C*) { return 5U; }; 
} 
namespace B 
{ 
    void f(void *) { }; 
    void f2 (A::C x) 
    { decltype(f(&x)) a; std::cout << typeid(a).name() << std::endl; } 
} 

int main (void) 
{ 
    A::C c; 
    B::f2(c); 
} 

Il compilatore ferma con Error C2182 e lamenta una variabile di tipo void. Sembra essere un problema indipendente dai modelli.

+0

Visual C++ utilizza un frontend C++ diverso per le funzionalità IntelliSense e IDE, quindi ci sono molte differenze tra ciò che IntelliSense accetta e ciò che il compilatore accetta. –

+0

Grazie per le informazioni. Non sono abbastanza sorpreso ma divertito. Volevo solo dare il suggerimento che i modelli non sono il problema qui. – Pixelchemist