2016-03-13 16 views
14

Questa è una versione semplificata che illustrano il problema:bug gcc? Decade inspiegabilmente array puntatore, mentre clang no

struct Foo { 
    Foo() = default; 

    template <std::size_t N> 
    Foo(const char(&)[N]) {} 
}; 

template <std::size_t N> 
auto foo(const char (&arr)[N]) -> Foo 
{ 
    return arr; 
} 

auto main() -> int 
{ 
    foo("Stack Overflow"); 
} 

g ++ sembra decadere arr a const char *, anche se un argomento riferimento matrice si passa ad un parametro di riferimento di matrice . Dà questo errore:

In instantiation of Foo foo(const char (&)[N]) [with long unsigned int N = 4ul] :

error: could not convert (const char*)arr from const char* to Foo

return arr; 
     ^

Mentre clang ++ si comporta come mi aspetto e compila il codice.

Il codice compila bene su gcc con una qualsiasi di queste modifiche:

return {arr}; 
return Foo(arr); 
return (Foo)arr; 
return static_cast<Foo>(arr); 

E 'un bug gcc?

provato con tutto g ++ e clang ++ versioni che supportano c++14. (*)

(*) Ho appena provato con una fotografia di gcc 6 e compila OK. Quindi sembra un bug risolto in

+0

Sembra decadimento prematuro. Perché non puoi restituire un array, ovviamente. ;) – Yakk

risposta

Problemi correlati