Können wir in einer noexcept-Spezifikation auf Member-Variablen verweisen?
Bitte beachten Sie den folgenden Codeausschnitt:
template<class Tuple>
class vector
{
public:
typename Tuple::size_type size() const noexcept(noexcept(m_elements.size())) {
return m_elements.size();
}
private:
Tuple m_elements;
};
class tuple
{
public:
using size_type = std::size_t;
size_type size() const { return 0; }
size_type size() noexcept { return 0; }
};
int main()
{
vector<tuple> x;
static_assert(noexcept(x.size()), "x.size() might throw");
return 0;
}
Ist die Verwendung der Mitgliedsvariablenm_elements
innerhalb desnoexcept
spezifizierer legal?GCC 5.2 (C ++ 17) liefert den Compilerfehler m_elements
wurde in diesem Bereich nicht deklariert. währendclang 3.6 (C ++ 17) wird fehlerfrei kompiliert.
Beide Compiler liefern keinen Fehler, wenn ich @ benutnoexcept(std::declval<Tuple const&>().size())
stattdessen. Wie Sie jedoch sehen können, habe ich eine einfache Beispielklasse @ erstelltuple
wo es entscheidend ist, ob oder nichtTuple
hat qualifizierte Überladungen vonsize
.
Aus meiner Sicht ist es intuitiver zu schreibennoexcept(m_elements.size())
weil es genau der Aufruf im Funktionsrumpf ist und berücksichtigt, dass dassize
Methode vonvector
istconst
qualifiziert (wodurchm_elements
Ein const-Objekt im Umfang der Funktion.
Also, was ist die legale Verwendung? Wenn beide gleichwertig sind, welche soll ich verwenden? Sollte ich es benutzennoexcept
Qualifikanten überhaupt in diesem Szenario? Das Problem ist, ob dasvector
Funktionen werden in den meisten Fällen von @ ausgelöTuple
.