2016-08-04 30 views
10

Wir hatten diese Situation und wunderte sich über den besten Weg, esWie kann ich "noexcept" sagen, wenn die Ausführung des geschützten Basiskonstruktors keine Ausnahme ist?

template<typename T> 
struct A : T { 
    A(T &&t) noexcept(noexcept(T(std::move(t)))) 
    :T(std::move(t)) 
    { } 
}; 

Dies ist leider zu beheben nicht Konstruktor bewegen zu kompilieren, weil T die geschützt ist, und wir sind nur für *this nennen es im Konstruktor Initialisierungsliste erlaubt. Was sind die Problemumgehungen um dies zu erreichen oder gibt es sogar einen Standard Weg dafür?

+0

„und wir sind nur für' * this' nennen es im Konstruktor Initialisierungsliste erlaubt“- warten, was? Ist dies eine spezielle Regel für geschützte * Konstruktoren *? Dass Sie sie nur in der Initialisierungsliste verwenden können? –

+0

Welcher Compiler kompiliert es nicht? – ecatmur

+1

@ecatmur Intel/GCC schlägt fehl (wahrscheinlich auch Clang). Wie bei allen geschützten Funktionen sind nur Aufrufe durch Objekte vom Typ '* this' oder abgeleitete Klassen erlaubt. –

Antwort

1

Sie suchen noexcept(std::is_nothrow_move_constructible<T>::value): http://en.cppreference.com/w/cpp/types/is_move_constructible

+4

Dies scheint nicht zu funktionieren, da der Verschiebungskonstruktor geschützt ist und das Merkmal keinen Zugriff darauf hat. –

+0

@ JohannesSchaub-litb scheint du musst hinzufügen, ist ein Freund der Basisklasse. –