2017-01-25 30 views
5

auto işlevinin dönüş türünü almaya çalışıyorum. This works: Bir sınıf kapsamında bir static auto işlevin dönüş türünü alma:Sınıf kapsamı içinde neden sınıf-statik otomatik işlevimin türüne ulaşılamıyor?

auto foo(int bar) 
{ 
    return 0; 
} 

typedef std::result_of<decltype(foo)> foo_t; 

Büyük, burada daha sonra sonraki adım. This also works:

struct Foo 
{ 
    static auto foo(int bar) 
    { 
     return 0; 
    } 
}; 

typedef std::result_of<decltype(Foo::foo)> foo_t; 

Ama this doesn't work:

struct Foo 
{ 
    static auto foo(int bar) 
    { 
     return 0; 
    } 

    typedef std::result_of<decltype(Foo::foo)> foo_t; 
}; 

GCC "hatası: 'auto' düşülmeden 'statik oto Foo :: foo (int)' kullanımı" diyor, Clang diyor "fonksiyonu ' "Getirilen getiri türü ile foo ', tanımlanmadan önce kullanılamaz". Niye ya?

+0

Sanırım std :: result_of :: type 'yazmak istediniz değil mi? –

+0

@ O'Neil Adil bir şans var, bunun nasıl çalıştığına dair hiç bir fikrim yok ... – zneak

cevap

9

Kodu yazdığınız şekilde görünmesi mümkün olsa da, foo() sınıf içi tanımı yalnızca sınıf tamamen tanımlandıktan sonra işlenebilir.

struct Foo 
{ 
    static auto foo(int bar); 

    typedef std::result_of<decltype(Foo::foo)> foo_t; 
}; 

auto Foo::foo(int bar) 
{ 
    return 0; 
} 

foo() tanımı foo_t dahil class Foo tanımlanan türde kullanmak için izin verilir, dairesel olurdu: Bu yazdıysam gibi. Bu nedenle, class Foo tanımının, üye işlevlerinin tanımını kullanmasına izin verilmez - yalnızca onların beyanları. Başka bir deyişle, kodun tamamen yukarıdan aşağıya doğru değerlendirildiğini varsayıyorsunuz. O değil.

+0

Bu, bildiğim her şey için doğru, ama "kodun tamamen yukarıdan aşağıya doğru değerlendirildiğini varsayıyorsunuz" biraz haksız bir ifade. – zneak

İlgili konular