Если я дамстанд :: result_of применяется к константному перегруженным методам
typedef std::vector<int> v;
Тогда ниже, может быть использована для захвата типа постоянного итератора (альтернатива заключается в использовании v::const_iterator
, но это зависит от const_iterator
тип элемент выполнен явно определен в классе.
typedef typename std::result_of<decltype(&v::cbegin)(v*)>::type const_iterator;
Действительно, мы можем проверить, что выше делает так, как мы хотим.
static_assert(std::is_same<const_iterator, typename v::const_iterator>::value);
Однако я обнаружил ошибку компилятора ниже.
typedef typename std::result_of<decltype(&v::begin)(v*)>::type iterator;
Компилятор жалуется, что метод перегружен (по константному модификатору) и не может быть однозначно решен. Однако я не могу найти синтаксис для устранения двусмысленности. Как минимум, мы ожидаем, что ниже будет однозначно, потому что только версия const может работать на const-объекте. Однако даже нижеследующее аналогично проблематично.
typedef typename std::result_of<decltype(&v::begin)(const v*)>::type const_iterator2;
Как я могу ссылаться на конкретную версию const или nonconst для начала?
Я понимаю этот ответ, но почему модификатор 'const' аргумента' v * 'выше не устраняет двусмысленность? – epl
Тип возврата 'std :: declval()' не 'v'. –
skypjack
@epl, потому что '&' уже пробовал и не смог принять адрес неоднозначного имени функции до того, как параметры когда-либо были просмотрены. –