2015-07-04 32 views
6

Ecco il codice minimo (C++ 14) per riprodurre il problema:riferimento ad una funzione di "auto" come parametro di template

template <void (&a)()> 
struct Foo { 
    static auto value() {} 
}; 

void bar() {} 

template struct Foo<Foo<bar>::value>; 

GNU C++ "g ++ (Ubuntu 5.1.0-0ubuntu11 ~ 14.04.1) 5.1.0" compilatore emette:

error: could not convert template argument ‘Foo<a>::value<bar>’ to ‘void (&)()’ 
template struct Foo<Foo<bar>::value>; 
            ^

La prima cosa strana che noto è Foo<a>::value<bar>-a non viene sostituito, e value ha in qualche modo diventare un modello?

le seguenti correzioni senza senso rafforzano la mia impressione che si tratta di un bug del compilatore:

  • Dichiarare value() come tornare void invece di dedurre che
  • "Dereferenziare" value: template struct Foo<*Foo<bar>::value>;
  • mettere tra parentesi value: template struct Foo<(Foo<bar>::value)>;
  • Fare a un puntatore: template <void (*a)()> struct Foo ...

Infine, Clang compila il mio snippet.

Quindi, c'è qualche oscura clausola standard da qualche parte che vieta il primo frammento o GCC è appena morto su di me?

+0

hai provato con clang? – hellow

+0

@cookiesoft Sto andando a provarlo. Modifica: funziona! – Quentin

+0

L'ho compilato con clang (versione 3.5) e C++ 1y e compilato. Non so, se è compilato correttamente, ma funziona :) – hellow

risposta

0

Questo comportamento è stato dedotto da errore ed è stato archiviato su GCC Bugzilla.

Problemi correlati