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 desnoexceptspezifizierer 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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage