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