template <class Rhs, class Ret=dont_care>
struct has_pre_decrement : public true_type-or-false_type {};
Наследники:Если (i)<rhs>типа<Rhs>можно использовать в выражении<--rhs>, и (ii)<Ret=dont_care>или результат выражения<--rhs>конвертируем в<Ret>, то наследуется отtrue_type, в противном случае наследуется отfalse_type.
По умолчанию поведение<Ret=dont_care>не проверяется на возвратное значение префикса<operator-->. Если<Ret>отличается от типа по умолчанию<dont_care>, то значение возврата проверяется на конвертируемость в<Ret>. Конвертируемое к<Ret>означает, что возвращаемое значение оператора может быть использовано в качестве аргумента для функции, ожидающей<Ret>:
void f(Ret);
Rhs rhs;
f(--rhs);
Если<Ret=void>, то тип возврата проверяется точно<void>.
Заголовок:<#include
<boost/type_traits/has_pre_decrement.hpp>>или<#include<boost/type_traits/has_operator.hpp>>или<#include<boost/type_traits.hpp>>
Совместимость компилятора:Требуется работа SFINAE (т.е. BOOST_NO_SFINAE не установлен). Этого не поддерживает лишь меньшинство довольно старых компиляторов.
Примеры:
<has_pre_decrement<Rhs,Ret>::value_type>является типом<bool>.
<has_pre_decrement<Rhs,Ret>::value>— интегральное постоянное выражение<bool>.
<has_pre_decrement<int>::value>— интегральное постоянное выражение<bool>, оценивающее до<true>.
<has_pre_decrement<long>>наследуется от<true_type>.
<has_pre_decrement<int,int>>наследуется от<true_type>.
<has_pre_decrement<int,long>>наследуется от<true_type>.
<has_pre_decrement<double,double>>наследуется от<true_type>.
<has_pre_decrement<double,int>>наследуется от<true_type>.
<has_pre_decrement<bool>>наследуется от<false_type>.
<has_pre_decrement<constint>>наследуется от<false_type>.
<has_pre_decrement<void*>>наследуется от<false_type>.
<has_pre_decrement<int,std::string>>наследуется от<false_type>.
См. также:Типы операторов
Известные вопросы:
- Эта черта не может определить, является ли префикс<
operator-->общедоступным или нет: если<operator-->определен как частный член<Rhs>, то инстанцирование<has_pre_decrement<Rhs>>приведет к ошибке компилятора. По этой причине<has_pre_decrement>не может использоваться для определения того, имеет ли тип публичный<operator-->или нет.<structA{private:voidoperator--();};
boost::has_pre_decrement<A>::value;
>
- Существует проблема, если оператор существует только для типа<
A>и<B>является конвертируемым в<A>. В этом случае компилятор сообщит о двусмысленной перегрузке.<structA{};
voidoperator--(constA&);
structB{operatorA();};
boost::has_pre_decrement<A>::value;
boost::has_pre_decrement<B>::value;
>
- Существует проблема при применении этой черты к классам шаблонов. Если<
operator-->определен, но не связывается для данного типа шаблона, он все еще обнаруживается чертой, которая возвращается<true>вместо<false>. Пример:<#include<boost/type_traits/has_pre_decrement.hpp>
#include<iostream>
template<classT>
structcontains{Tdata;};
template<classT>
booloperator--(constcontains<T>&rhs){
returnf(rhs.data);
}
classbad{};
classgood{};
boolf(constgood&){}
intmain(){
std::cout<<std::boolalpha;
std::cout<<boost::has_pre_decrement<contains<good>>::value<<'\n';
contains<good>g;
--g;
std::cout<<boost::has_pre_decrement<contains<bad>>::value<<'\n';
contains<bad>b;
--b;
return0;
}
>
- <
volatile>квалификатор не обрабатывается должным образом и приведет к неопределенному поведению