¿Podemos referirnos a las variables miembro en una especificación noexcept?

Considere el siguiente fragmento de código:

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;
}

Es el uso de la variable miembrom_elements dentro denoexcept especificador legal?GCC 5.2 (C ++ 17) produce el error del compilador m_elements no fue declarada en este ámbito. mientrasclang 3.6 (C ++ 17) compila sin ningún error.

Ambos compiladores no producen ningún error si usonoexcept(std::declval<Tuple const&>().size()) en lugar. Sin embargo, como puede ver, he creado una clase de ejemplo simpletuple donde es crucial si o noTuple tiene sobrecargas calificadas desize.

Desde mi punto de vista, es más intuitivo escribirnoexcept(m_elements.size()) porque es exactamente la llamada en el cuerpo de la función y tiene en cuenta que elsize método devector esconst calificado (lo que hacem_elements un objeto constante en el alcance de la función).

Entonces, ¿cuál es el uso legal? Si ambos son equivalentes, ¿cuál debo usar? Debería usarnoexcept calificadores en absoluto en este escenario? El problema es que si elvector funciones lanzará depende en la mayoría de los casos enTuple.

Respuestas a la pregunta(1)

Su respuesta a la pregunta