Как мне написать ADL-совместимый конечный возвращаемый тип или спецификация noexcept?

Представьте, что я пишу какой-то шаблон контейнера или что-то в этом роде. И пришло время специализировать для этого std :: swap . Как порядочный гражданин, я включу ADL, сделав что-то вроде этого:

template <typename T>
void swap(my_template<T>& x, my_template<T>& y) {
    using std::swap;
    swap(x.something_that_is_a_T, y.something_that_is_a_T);
}

Это очень удобно и все такое. Пока я не хочу добавить спецификацию исключения. Мой своп равен noexcept , пока своп для T равен noexcept . Итак, я бы написал что-то вроде:

template <typename T>
void swap(my_template<T>& x, my_template<T>& y)
    noexcept(noexcept(swap(std::declval<T>(), std::declval<T>())))

Проблема в том, что там своп должен быть обнаруженный ADL своп или std :: swap ]. Как мне с этим справиться?

46
задан R. Martinho Fernandes 2 November 2013 в 17:45
поделиться