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
fromconst char*
toFoo
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
Sembra decadimento prematuro. Perché non puoi restituire un array, ovviamente. ;) – Yakk