2013-07-06 24 views
15

Rozumiem, że decltype służy do sprawdzania typu obiektów/zmiennych i tak dalej.Dlaczego rozwiązywanie problemu kończy się niepowodzeniem w przypadku wystąpienia decltype?

Z przykładów obecnych na wikipedii, jak następuje:

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

Przypuszczałem mógłby zrobić coś takiego:

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 

Bo przecież ta linia jest legalne:

IsClass<std::vector<A>::iterator::value_type>::Yes 

Niestety nie byłoby skompilować, powołując się na następujące: error C2039: 'value_type' : is not a member of ' globalnej przestrzeni nazw „” `

pomysłów, dlaczego rozdzielczości zakres został wykonany w ten sposób zachowywać się w obecności decltype?

P.S: Jeśli to czyni żadnej różnicy używam MSVC2012 (bez CTP listopada)

+5

'' clang' gcc' i zdają się akceptować to: http://coliru.stacked-crooked.com/view?id=bc884ca6b1f51d36c231f2eb08dec3ad-f674c1a6d04c632b71a62362c0ccfc51 –

+0

@ShafikYaghmour prostu wklejone to pod MSVC2012 który używam (I dodano notatkę do tego efektu) i nie kompiluje się. – Borgleader

+3

MSVC nie ssać choć nie zostały one wykonane z tego samego postępu wdrażania normy jako gcc i brzękiem – aaronman

Odpowiedz

10

To znany błąd w Visual C++ kompilatora. Nie zostało to jeszcze naprawione od wersji Visual C++ 2013 Preview. Można obejść ten problem używając std::common_type:

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

(std::common_type z pojedynczym rentowności szablon argument, że rodzaj argumentu, jest to standaryzowany C++ 11 odpowiednik identity szablonu, który od dawna stosowane w metaprogramowanie.)

Możesz znaleźć publiczny raport o błędach w witrynie Microsoft Connect: Cannot use decltype before scope operator. Jeśli ten problem jest dla ciebie ważny, rozważ uwzględnienie tego zgłoszenia błędu.

+1

Nadal nie rozumiem, dlaczego nie mogliby tego nazwać 'std :: identity'. Wiesz, jak wszyscy inni. –

+0

@LightnessRacesinOrbit: Wystąpił 'std :: identity' wcześniej, ale został usunięty, ponieważ nie było jasne, co dokładnie powinno być (tylko tożsamość meta-programowania, jak' std :: common_type 'jest teraz tożsamość funkcjonalna?) , IIRC. – Xeo

+0

@Lightness Races in Orbit: Nie wygląda to na pytanie, jak go "wywołać". Funkcjonalność 'std :: common_type' jest szersza niż funkcja' std :: identity'. Obejmuje po prostu 'std :: identity'. Tak więc pytanie brzmiało, czy zachować 'std :: identity' jako coś o ładniejszej nazwie, czy też usunąć je jako zbędne. Usunęli to. – AnT

Powiązane problemy