Наследники:Если (i)<lhs>типа<Lhs>и<rhs>типа<Rhs>можно использовать в выражении<lhs/=rhs>, и (ii)<Ret=dont_care>или результат выражения<lhs/=rhs>является конвертируемым в<Ret>, то наследуется отtrue_type, в противном случае наследуется отfalse_type.
По умолчанию поведение<Ret=dont_care>не проверяется на обратное значение двоичного<operator/=>. Если<Ret>отличается от типа по умолчанию<dont_care>, то значение возврата проверяется на конвертируемость в<Ret>. Преобразуемое в<Ret>означает, что возвращаемое значение оператора может использоваться в качестве аргумента для функции, ожидающей<Ret>:
voidf(Ret);Lhslhs;Rhsrhs;f(lhs/=rhs);// is valid if has_divides_assign<Lhs, Rhs, Ret>::value==true
Если<Ret=void>, то тип возврата проверяется точно<void>.
Совместимость компилятора:Требуется работа SFINAE (т.е. BOOST_NO_SFINAE не установлен). Этого не поддерживает лишь меньшинство довольно старых компиляторов.
Эта черта не может определить, является ли двоичный<operator/=>публичным или нет: если<operator/=>определен как частный член<Lhs>, то инстанцирование<has_divides_assign<Lhs>>приведет к ошибке компилятора. По этой причине<has_divides_assign>не может использоваться для определения того, имеет ли тип публичный<operator/=>или нет.<
structA{private:voidoperator/=(constA&);};boost::has_divides_assign<A>::value;// error: A::operator/=(const A&) is private
>
Существует проблема, если оператор существует только для типа<A>и<B>является конвертируемым в<A>. В этом случае компилятор сообщит о двусмысленной перегрузке.<
structA{};voidoperator/=(constA&,constA&);structB{operatorA();};boost::has_divides_assign<A>::value;// this is fineboost::has_divides_assign<B>::value;// error: ambiguous overload
>
Существует проблема при применении этой черты к классам шаблонов. Если<operator/=>определен, но не связывается для данного типа шаблона, он все еще обнаруживается чертой, которая возвращается<true>вместо<false>. Пример:<
#include<boost/type_traits/has_divides_assign.hpp>#include<iostream>template<classT>structcontains{Tdata;};template<classT>booloperator/=(constcontains<T>&lhs,constcontains<T>&rhs){returnf(lhs.data,rhs.data);}classbad{};classgood{};boolf(constgood&,constgood&){}intmain(){std::cout<<std::boolalpha;// works fine for contains<good>std::cout<<boost::has_divides_assign<contains<good>>::value<<'\n';// truecontains<good>g;g/=g;// ok// does not work for contains<bad>std::cout<<boost::has_divides_assign<contains<bad>>::value<<'\n';// true, should be falsecontains<bad>b;b/=b;// compile time errorreturn0;}
>
<volatile>квалификатор не обрабатывается должным образом и приведет к неопределенному поведению
Статья has_divides_assign раздела Chapter 1. Boost.TypeTraits Alphabetical Reference может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.