Odpowiadając this question, próbowałem następujący kod z GCC (code compiled) i szczęk (code rejected):constexpr statyczny wskaźnik do funkcji, różnica między kompilatory
typedef long (*func)(int);
long function(int) { return 42; }
struct Test
{
static constexpr func f = &function;
};
template<func c>
struct Call
{
static void f()
{
c(0);
}
};
int main()
{
Call<Test::f>::f();
}
Nie jestem pewien, które kompilator ma rację, chociaż myślę, że inicjalizacja constexpr Test::f
jest w porządku. Wyjścia błąd dzyń jest:
error: non-type template argument for template parameter of pointer type 'func'
(aka 'long (*)(int)') must have its address taken
- Który kompilator ma rację?
- Jeśli clang ma rację, dlaczego i co ten błąd naprawdę oznacza?
EDIT bo "dlaczego", patrz DyP's question.
Zastanawiam się, czy nie '& zakresie funkcji jest rzeczywiście ważne dla inicjatora' constexpr'. Oba kompilatory wydają się tak sądzić. Ale wydaje mi się to niemiłą. Nie jest to znane podczas kompilacji, tylko w czasie łączenia. – Omnifarious
'& function' jest adresem funkcji, więc dla mnie jest znana w czasie kompilacji ... Na przykład można przekazać wskaźnik do funkcji jako argument szablonu. – Synxis
Wskaźnik do funkcji to jedno ... jeśli na przykład jest to część biblioteki współdzielonej, w jaki sposób adres mógł zostać zakwalifikowany jako "constexpr"? –