decltype(expr)::member
-
Der Code
#include <vector> int main() { std::vector<int> v; decltype(v)::iterator i = v.begin(); }kompiliert weder auf MSVC noch g++. Hingegen macht
#include <vector> int main() { std::vector<int> v; typedef decltype(v) type; type::iterator i = v.begin(); }keine Probleme.
Gibt es eine Regel im Standard, die direkten Memberzugriff eines
decltype-Ausdrucks verbietet, oder handelt es sich lediglich um unausgereifte C++11-Unterstützung?
-
Nexus schrieb:
Gibt es eine Regel im Standard, die direkten Memberzugriff eines
decltype-Ausdrucks verbietet, oder handelt es sich lediglich um unausgereifte C++11-Unterstützung?Ich glaube, decltype ist einfach nicht aufgezählt, bei wo was steht, was links von :: stehen darf.
Ich schätze, hiermit bist DU dann auch nicht glücklich.
#define decltype(x) ::std::identity<decltype(x)>::type
-
Ich habe irgendwie in Erinnerung, dass diese "Macke" behoben wurde. (kann mich aber irren). Im besten Fall, unterstützen die Compiler das einfach noch nicht.
-
volkard schrieb:
Ich glaube, decltype ist einfach nicht aufgezählt, bei wo was steht, was links von :: stehen darf.
So habe ich das noch nicht gesehen. Ich bin bisher aber davon ausgegangen, der
decltype-Ausdruck könnte 1:1 mit dem Typen seines Arguments ersetzt werden.So wie ich es verstehe, sollte
decltype(expr)::membereigentlich syntaktisch möglich sein:N3290, §5.1.1 schrieb:
unqualified-id:
identifier
operator-function-id
conversion-function-id
literal-operator-id
~ class-name
~ decltype-specifier
template-idqualified-id:
nested-name-specifier templateopt unqualified-id
:: identifier
:: operator-function-id
:: literal-operator-id
:: template-idnested-name-specifier:
::opt type-name ::
::opt namespace-name ::
decltype-specifier ::
nested-name-specifier identifier ::
nested-name-specifier templateopt simple-template-id ::Und der Vollständigkeit halber:
§7.1.6.2/4 schrieb:
The type denoted by
decltype(e)is defined as follows:
— if e is an unparenthesized id-expression or an unparenthesized class member access (5.2.5),decltype(e)is the type of the entity named bye. [...]volkard schrieb:
Ich schätze, hiermit bist DU dann auch nicht glücklich.
#define decltype(x) ::std::identity<decltype(x)>::typeInteressante Idee, sonst wäre auch
typeofeine Möglichkeit
-
Dein Zitat von N3290 klingt überzeugen. Also ist wohl die Macke behoben. Und das Makro muß tatsächlich her und die Lücke füllen, bis der Compiler repariert ist.
-
Jetzt bin ich gerade auf den Bug-Report für MSVC gestossen.
-
#include <vector> int main() { std::vector<int> v; decltype(v)::iterator i = v.begin(); }Wäre in dem Fall
#include <vector> int main() { std::vector<int> v; auto i = v.begin(); }Nicht die einfachere Lösung?
-
Doch, aber das sollte nur ein Minimalbeispiel sein. In einigen Situationen( z.B. bei Klassentemplateparametern) braucht man den Typen nach wie vor.