2015-05-11 13 views
17

vedo esempio dal C++ 11 standard (n3337, 14.8.2.3/7)Template tipo di argomento deduzione da operatore di conversione

struct A { 
template <class T> operator T***(); 
}; 
A a; 
const int * const * const * p1 = a; // T is deduced as int, not const int 

e cercare di riprodurlo da diversi compilatori. Ho cambiato l'esempio leggermente aggiungendo una dichiarazione di tipo T in una funzione di conversione

struct A { 
    template <class T> operator T***() 
    { 
     T t; //if T==const int, then it is error (uninitialized const) 
     return nullptr; 
    } 
}; 
A a; 
const int * const * const * p1 = a; 

int main(){} 

Tutti i compilatori (VS2014, gcc 5.1.0 e 3.5.1 clang) danno un errore nella dichiarazione di "t" , il che significa che T è dedotto come const int. Perché? È qualche estensione?

+3

Congratulazioni, hai trovato un bug del compilatore. (Questa non è un'estensione conforme, ma rifiuta il codice che è ben formato secondo lo standard.) –

+2

@ T.C. Appena [segnalato] (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66108) it. Troppo male bugzilla non ti lascia commettere ninja-edit! – Barry

+1

Sorprendentemente. Ben 3 compilatori hanno lo stesso bug :) P.S. compilatori icc 13.0.1 ok – user3514538

risposta

9

Questo è stato coperto da CWG issue #349, aperto da uno sviluppatore del EDG C++ front end (che deduce quanto pare int, non const int):

ci siamo imbattuti in una questione che riguarda le conversioni di qualificazione quando si fa modello argomento deduzione per le funzioni di conversione .

La domanda è: qual è il tipo di T nelle funzioni di conversione richiamato da questo esempio? T "int" o "const int"?

Se T è "int", la funzione di conversione in classe A funziona e quella in classe B non riesce (poiché l'espressione di ritorno non può essere convertita in il tipo di ritorno della funzione). Se T è "const int", A fallisce e B funziona.

Poiché la conversione della qualifica viene eseguita sul risultato della funzione di conversione , non vedo alcun vantaggio nella deduzione di T come const int.

Inoltre, penso che il codice nella classe A è più probabile che si verifichi rispetto il codice nella classe B. Se l'autore della classe stava progettando su restituire un puntatore ad un'entità const, mi aspetterei la funzione a sono stati scritti con un const nel tipo di ritorno.

Di conseguenza, credo che il risultato corretto dovrebbe essere che T è int.

Abbiamo appena implementato questa funzione, e in attesa di chiarimenti da parte del comitato, deduciamo T come int. Sembra che g ++ e il compilatore Sun deducano T come const int.

Questo ha portato solo il paragrafo citato in esistenza (non esisteva in C++ 03!), Ed è stato probabilmente trascurato dagli sviluppatori del compilatore.

Problemi correlati