Правильно ли я понял Std, что для set также должны работать явные преобразования bool?
Это своего рода серая область спецификации.Возвращаемое значение из функции сравнения должно быть «конвертируемым в bool».Но что это означает в свете explicit operator bool()
, неясно.
Например, можно написать сравнение использования std::set
так:
CompFunc functor;
if(functor(input, currVal))
...
Или это можно сделать:
CompFunc functor;
bool test = functor(input, currVal);
if(test)
...
Являются ли они технически законными в C ++ 11?Без понятия.Очевидно, что второй сбой, если operator bool()
равен explicit
.
Я посмотрел на определение std::shared_ptr
, и у него также есть explicit operator bool()
.В нем также говорится, что std::shared_ptr
«конвертируется в bool», в разделе 20.7.2.2, параграф 2.
Так что я предполагаю, что вторая версия должна быть реализована следующим образом:
CompFunc functor;
bool test = static_cast<bool>(functor(input, currVal));
if(test)
...
Тот факт, что это нигде явно не указано в спецификации, означает, что он должен быть подан как отчет о дефектах.Но, вероятно, его также следует регистрировать как ошибку GCC / libstdc ++.
Лично для безопасности я бы не стал полагаться на это.
В контексте контекстного преобразования
Раздел 4, параграф 3 гласит:
Выражение e, появляющееся в таком контексте, называется контекстно преобразованным в bool и является правильно сформированным тогда и только тогда, когда объявление bool t (e);является корректным, для некоторой изобретенной временной переменной t
Таким образом, операции, которые "контекстно преобразуются в bool", означают, что explicit operator bool()
будет работатьТак как функтор «Сравнение» std::set
должен соответствовать требованиям 25.4, и эти требования включают «контекстно преобразованный в bool», он выглядит как ошибка GCC / libstdc ++.
Я бы по-прежнему избегал этогоэто когда ты можешь помочь, хотя.