Я играю с новым явным
для операторов приведения. Если вы напишете что-то вроде
struct Data {
explicit operator string();
};
Невозможно случайно преобразовать Данные
в строку
. Тип данных darget bool
является исключением: в некоторых случаях неявное преобразование разрешено, даже если оно отмечено явным
- контекстным преобразованием . Таким образом, вы можете использовать эти типы данных в if (...)
, например:
struct Ok {
explicit operator bool(); // allowed in if(...) anyway
};
Параграф «25.4. (2) Сортировка и связанные операции» , похоже, разрешает это для функтора Compare
стандартных контейнеров , как и set
. Но мои попытки с gcc-4.7.0 терпят неудачу, и я уверен, что это мое недопонимание или ошибка в gcc?
#include <set>
struct YesNo { // Return value type of Comperator
int val_;
explicit YesNo(int y) : val_{y} {}
/* explicit */ operator bool() { return val_!=0; }
};
static const YesNo yes{1};
static const YesNo no{0};
struct LessYesNo { // Comperator with special return values
YesNo operator()(int a, int b) const {
return a<b ? yes : no;
}
};
int main() {
std::set<int,LessYesNo> data {2,3,4,1,2};
}
Без явного
перед оператора bool ()
пример компилируется. И мое понимание «25.4. (2)» таково, что он также должен компилировать с явным.
Правильно ли я понял Std, что для set
также должны работать явные
bool
преобразования? Может быть, это ошибка в gcc, или я что-то не так?