2016-03-21 11 views
4

Ich habe viele Informationen über Rvalue gelesen und lokale Variablen in C++> = 11. Von was ich verstanden habe ist, dass "nur nach Wert, nicht verschieben/vorwärts und nicht & & Methodensignatur und die Compiler wird es für Sie optimieren ".Warum verwendet C++ bei der Rückgabe von local std :: stringstream nicht RVO?

Okay, ich will es geschehen:

#include <sstream> 

std::stringstream GetStream() { 
    std::stringstream s("test"); 
    return s; 
} 

auto main() -> int { 
    auto s = GetStream(); 
} 

ich das schöne

error: use of deleted function ‘std::basic_stringstream<char>::basic_stringstream(const std::basic_stringstream<char>&)’ 
    return s; 

Fehler. Ich verstehe es nicht, warum es den Kopierkonstruktor versucht? Soll es nicht Move Constructor mit all den schönen Dingen aus C++ 11 hier verwenden? Ich benutze "--std = C++ 14".

+2

Diese kompilieren [ohne Fehler] (http://ideone.com/7aOvLQ). Welchen Compiler benutzen Sie? – Holt

+4

Meine Kristallkugel sagt mir, dass Sie GCC 4.9 verwenden, das keine Bewegungssemantik für 'stringstream' unterstützt. Wenn Sie C++ 14 verwenden möchten, sollten Sie einen Compiler verwenden, der dies unterstützt. –

+0

Ja, Sie sind auf dem richtigen Weg. gcc 4.9.3. –

Antwort