2013-07-06 23 views
15

Benim düşüncem, bir nesnenin/değişkenin türünü sorgulamak için dekolemin kullanıldığı anlamındadır. aşağıdaki gibi wikipedia mevcut örneklerden itibarenNeden decltype varlığında kapsam çözünürlüğü başarısız olur?

:

int i; 
decltype(i) x3; // type is int 

Ben böyle bir şey yapabileceğini kabul:

class A 
{ 
public: 
    int a, b; 
}; 

template<typename T> 
struct IsClass 
{ 
    enum { Yes = std::is_class<T>::value }; 
    enum { No = !Yes }; 
}; 

std::vector<A> v; 
auto it = v.begin(); 
IsClass<decltype(it)::value_type>::Yes 

tüm bu çizgi yasaldır sonra Çünkü:

Ne yazık ki, aşağıdakileri gerekçe göstermez: error C2039: 'value_type' : is not a member of ' global namespace ''

Kapsam çözme, declype varlığında bu şekilde davranmak için neden yapıldığı ile ilgili herhangi bir fikir?

P.S.: Bu

+5

'gcc' ve' clang' bunu kabul görünmektedir: I (I kullanıyorum hangi http://coliru.stacked-crooked.com/view?id=bc884ca6b1f51d36c231f2eb08dec3ad-f674c1a6d04c632b71a62362c0ccfc51 –

+0

@ShafikYaghmour Sadece MSVC2012 içine bu yapıştırılan Bu etki için bir not eklendi) ve derleme yapmıyor. – Borgleader

+3

MSVC, yine de, gcc ve clang – aaronman

cevap

10

( Kasım CTP olmadan ) Ben MSVC2012 kullanıyorum fark edecekse Bu, Visual C++ derleyici içinde bilinen bir hatadır. Henüz Visual C++ 2013 Önizleme olarak düzeltilmemiş. Sen std::common_type kullanarak bu soruna geçici bir çözüm olabilir:

IsClass<std::common_type<decltype(it)>::type::value_type>::Yes 
     ^^^^^^^^^^^^^^^^^   ^^^^^^^ 

(std::common_type tek şablon argümanı verimi ile bu argüman türü; uzun metaprogramlama kullanılmıştır identity şablonun standardize C++ 11 eşdeğerdir.)

Genel hata raporunu Microsoft Connect'te bulabilirsiniz: Cannot use decltype before scope operator. Bu sorun sizin için önemliyse, lütfen hata raporunu gözden geçirmeyi düşünün.

+1

Hala neden buna std :: identity' diyemediklerini anlamıyorum. Biliyor musunuz, herkes gibi. –

+0

@LightnessRacesinOrbit: Önceden bir "std :: identity" vardı, ancak tam olarak ne olması gerektiği belirsiz olduğundan kaldırıldı (sadece meta-programlama kimliği, örneğin std :: common_type 'şimdi? İşlevsel kimlik?) IIRC. – Xeo

+0

@Orbit'te Işıklar Yarışları: Ne "çağırmak" meselesi gibi görünmüyor. Std :: common_type' işlevinin işlevi std :: identity'ınkinden daha geniştir. Sadece 'std :: identity' da kapsar. Öyleyse soru gerçekten “std :: identity” 'i daha güzel bir isimle bir şey olarak tutmak ya da onu gereksiz bir şey olarak kaldırmaktı. Onu çıkardılar. – AnT

İlgili konular