2016-01-16 23 views
7

Can wirtualne funkcje, takie jak X::f() w poniższym kodzieCzy funkcje wirtualne mogą być constexpr?

struct X 
{ 
    constexpr virtual int f() const 
    { 
     return 0; 
    } 
}; 

być constexpr?

+2

Pomyśl o tym przez chwilę. Całkowicie pokonałoby to cel 'constexpr'. –

+0

Taka hipotetyczna funkcja może być używana jako wyrażenie stałe tylko wtedy, gdy znany jest cały typ wywołującej instancji "X". Wymagałoby to w zasadzie języka do określenia "reguł dewizytyzacji". –

+1

@ πάνταῥεῖ W D możesz wykonać funkcję kompilacji funkcji czasu z funkcjami wirtualnymi. Więc nie jest to nie do pomyślenia. –

Odpowiedz

24

nr Z [dcl.constexpr]/3 (7.1.5 "The constexpr specyfikatora")

Definicja constexpr funkcję spełnia następujące wymagania:

- it nie będzie wirtualny

+0

To jest dziwne, dla 'gcc wersji 4.9.2 20141101 (Red Hat 4.9.2-1) (GCC)' [to działa] (http://pastebin.com/gBRT31VG) – zaratustra

+5

Tylko dlatego, że kompilator akceptuje coś nie robi ' T oznacza, że ​​jest to dozwolone. –

+1

Clang ++ nie akceptuje kodu w linku. –