Move-Konstruktor wird beim Auslösen einer Ausnahme nicht aufgerufen

Ich habe eine Variable, die die aktuelle Ausnahme akkumuliert und bereinigt werden muss, wenn die aktuelle Ausnahme ausgelöst wird (damit derselbe Fehler nicht erneut gemeldet wird). Das Problem ist, dassthrow std::move(ex); ruft den move-Konstruktor nicht auf (was @ bereinigen würex), sondern ruft einen Kopierkonstruktor auf (damitex bleibt auch bei den bereits geworfenen Fehlern). Es folgt eine MVCE:

#include <iostream>
#include <stdexcept>
#include <string>
using namespace std;

class ThrowMoveTest : exception
{
public:
    ThrowMoveTest(const string& what)
    {
        _what = what;
    }
    ThrowMoveTest(const ThrowMoveTest& fellow)
    {
        cout << "Copy " << what() << endl;
        _what = fellow._what;
    }
    ThrowMoveTest(ThrowMoveTest&& fellow)
    {
        cout << "Move " << what() << endl;
        _what = std::move(fellow._what);
    }
    virtual const char* what() const override
    {
        return _what.c_str();
    }
private:
    mutable string _what;
};

int main()
{
    try
    {
        ThrowMoveTest tmt1("Test1");
        throw move(tmt1);
    }
    catch (const ThrowMoveTest& ex)
    {
        cout << "Caught " << ex.what() << endl;
    }
    return 0;
}

Ich verwende MSVC ++ 2013 Update 5.

Gibt es etwas, was ich falsch mache, damit der move-Konstruktor aus diesem Grund nicht aufgerufen wird? Gibt es eine Möglichkeit, eine Ausnahme auszulösen, damit das temporäre Objekt, das für den Ausnahmespeicher in C ++ verwendet wird, vom Original verschoben und nicht kopiert wird?

Was ich zu vermeiden versuche, ist doppeltes Kopieren: Erstellen einer Kopie vontmt1, dann das Original säubern, dann die Kopie in @ verwendthrow -Anweisung, die eine weitere Kopie für die temporäre Speicherung erstellt.

EDIT: Das obige Codebeispiel gibt die folgende Ausgabe auf MSVC ++ 2013 Update 5 @ au

Copy
Caught Test1

Während die erwartete Ausgabe @ i

Move
Caught Test1

EDIT2: Reichte einen Compiler-Fehlerbericht einhttps: //connect.microsoft.com/VisualStudio/feedback/details/182982

Antworten auf die Frage(4)

Ihre Antwort auf die Frage