Warnung mit automatischer Rückgabetyp Abzug: warum brauchen wir decltype bei der Rückkehr definiert der Typ überhaupt?

Dies ist eine Frage, was tun Sie für die elementsSize() member-Funktion, in Bezug auf die automatische Rückgabetyp Abzug:

#include <iostream>
#include <vector>

template<typename Element>
class ElementVector
{
    std::vector<Element> elementVec_;  

    //Other attributes.

    public: 

        ElementVector() = default; 

        ElementVector(const std::initializer_list<Element>& list)
            :
                elementVec_(list)
        {}

        auto elementsSize() //-> decltype(elementVec_size()) 
        {
            return elementVec_.size(); 
        }
};

using namespace std;

int main(int argc, const char *argv[])
{
    ElementVector<double> e = {1.2, 1.3, 1.4, 1.5};  

    cout << e.elementsSize() << endl;

    return 0;
}

Den obigen code führt zu einem compiler-Warnung (gcc 4.8.2):

main.cpp:20:27: warning: elementsSize function uses auto type specifier without trailing return type [enabled by default]
         auto elementsSize() //-> decltype(elementVec_size()) 

Habe ich gelesen, über die option der automatischen Rückgabetyp Abzug ermöglicht für C++14 ohne den Einsatz von decltype.

Schreiben auskommentiert decltype scheint komisch zu mir, irgendwie. Was mache ich falsch?

Hinweis: ich weiß, dass ich könnte Erben von std::vector wenn es keine Vektor unter "Weitere Attribute", und genau das ist der Fall in meinem tatsächlichen problem.

  • "Ich weiß, dass ich könnte Erben von std::vector" - Das ist wahrscheinlich eine sehr schlechte Idee.
  • Sie beantwortet Ihre eigene Frage, es war komisch, zu schreiben, decltype, so dass C++14 ist es zu ändern.
  • Ich bin mir nicht ganz sicher, was Sie Fragen - Sie scheinen Ihre eigene Frage zu beantworten. Für jetzt, die Sprache benötigt einen Rückgabetyp, da Rückgabetyp Abzug hatte es nicht in C++11 für die normalen Funktionen (nur für Lambda-Ausdrücke); so dass Sie brauchen, zu geben, one (mit decltype oder anderweitig). Wenn Sie einen compiler, unterstützt Abzug (der, wie Sie sagen, sollten zum standard werden später in diesem Jahr), können Sie ihn weglassen.
  • tatsächlich, die option habe ich "ausgeliehen", die von boost.geometrie. Check out boost/geometrie/multi/Geometrien/multi_polygon.hpp
  • ok, also sollte ich code mit decltype und sauber, sobald gcc wird aktuell mit C++14?
  • Ja. Oder vielleicht benutzen Sie einfach size_t.
  • noch eine Frage - was ist der Vorteil jetzt der auto+decltype v. s. typedef size_type und und eine entsprechende Rendite?
  • Vorlage < typename Polygon-Vorlage<typename, typename> class Container = std::Vektor, Vorlage<typename> class Allocator = std::allocator > Klasse multi_polygon : public Container<Polygon, Allocator<Polygon> > { BOOST_CONCEPT_ASSERT( (Konzept::Polygon<Polygon>") );};
  • Trailing-return-Typen können basierend auf der Funktion parameter-Typen, z.B. auto add(T1 a, T2 b) -> decltype(a+b). Führende Rückgabetypen nicht.
  • O. K, klar. Vielen Dank!
  • naja, das ändert nichts an der Tatsache, dass es eine schlechte Idee. Der Destruktor std::vector ist nicht deklariert virtual. Weißt du, was bedeutet es?
  • Undefiniertes Verhalten, wenn ein Objekt der Klasse abgeleitet von std::vector wird zerstört, wenn die auf einem Haufen mit einem Zeiger auf base (std::vector), richtig? was ist, wenn ich nur wollen, um die Anpassung der vector interface für meine Bedürfnisse, ohne die Zusammensetzung zwingen Sie mich zu re-schreiben die gesamte öffentliche Schnittstelle für std::vector? Wenn ich keine zusätzlichen Attribute in den adapter, das sollte in Ordnung sein, richtig?
  • Sollten Sie keine Antwort auf Fragen, indem Sie Kommentare schreiben. Sie sollte Antworten auf Fragen schriftlich Antworten.

InformationsquelleAutor tmaric | 2014-01-21
Schreibe einen Kommentar