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)::member eigentlich 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-id

    qualified-id:
    nested-name-specifier templateopt unqualified-id
    :: identifier
    :: operator-function-id
    :: literal-operator-id
    :: template-id

    nested-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 by e . [...]

    volkard schrieb:

    Ich schätze, hiermit bist DU dann auch nicht glücklich.

    #define decltype(x) ::std::identity<decltype(x)>::type
    

    Interessante Idee, sonst wäre auch typeof eine 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.


Anmelden zum Antworten