Podemos nos referir a variáveis-membro em uma especificação noexcept?

Considere o seguinte snippet 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;
}

É o uso da variável membrom_elements dentro denoexcept especificador legal?O GCC 5.2 (C ++ 17) gera o erro do compilador m_elements não foi declarado neste âmbito. enquantoclang 3.6 (C ++ 17) compila sem nenhum erro.

Ambos os compiladores não produzem erro se eu usarnoexcept(std::declval<Tuple const&>().size()) em vez de. No entanto, como você pode ver, eu criei uma classe de exemplo simplestuple onde é crucial se deve ou nãoTuple sobrecargas qualificadas desize.

Do meu ponto de vista, é mais intuitivo escrevernoexcept(m_elements.size()) porque é exatamente a chamada no corpo da função e leva em consideração que osize método devector éconst qualificado (o que tornam_elements um objeto const no escopo da função).

Então, qual é o uso legal? Se ambos são equivalentes, qual devo usar? Devo usarnoexcept qualificadores neste cenário? O problema é que, independentemente de ovector funções irá lançar depende em quase todos os casos emTuple.

questionAnswers(1)

yourAnswerToTheQuestion