Неявное преобразование в явные логические типы для сортировки контейнеров?

Я играю с новым явным для операторов приведения. Если вы напишете что-то вроде

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, или я что-то не так?

10
задан towi 4 November 2011 в 17:44
поделиться