явный спецификатор, похоже, не работает при преобразовании объекта в bool - PullRequest
0 голосов
/ 29 января 2019

Я недавно изучаю C ++ и заметил пример cppreference , часть которого выглядит следующим образом:

struct B
{
    explicit B(int) { }
    explicit operator bool() const { return true; }
};

int main()
{
    B b2(2);       // OK: direct-initialization selects B::B(int)
    if (b2) ;      // OK: B::operator bool()
}

Введение в неявные преобразования говоритme "когда выражение используется в операторе if или цикле", результат этого выражения (b2) будет неявно преобразован в тип bool.

Кроме того, введение в явный спецификатор сообщает мне, если «функция преобразования является явной, ее нельзя использовать для неявных преобразований».

Поскольку b2 будет неявно преобразована в if(b2), а функция преобразования будет explicit, как получается if(b2) в порядке?

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Читайте далее по вашей собственной ссылке .Контекстные преобразования происходят неявно даже для explicit преобразований:

Контекстные преобразования

В следующих контекстах ожидается тип bool, и неявное преобразование выполняется, если объявление bool t(e);правильно сформирован (то есть рассматривается явная функция преобразования, такая как explicit T::operator bool() const;).Такое выражение e называется контекстно преобразованным в bool.

  • управляющее выражение if, while, for;
  • операнды встроенных логических операторов !, && и ||;
  • первый операнд условного оператора ?:;
  • предикат в объявлении static_assert;
  • выражение в спецификаторе noexcept;
  • выражение в спецификаторе explicit;
  • предикат атрибута контракта.
0 голосов
/ 29 января 2019

Контекстное преобразование является особенным;поскольку C ++ 11, explicit функции преобразования будут рассматриваться в контекстных преобразованиях.

(выделено мной)

(начиная с C ++ 11)

В следующих контекстах ожидается тип bool и неявное преобразование выполняется, если объявление bool t(e); правильно сформировано (то есть явная функция преобразования, такая как явный T :: operator bool () const; считается) .Такое выражение e называется контекстно преобразованным в bool .

  • управляющим выражением if, while, для;
  • theоперанды встроенных логических операторов!, && и ||;
  • первый операнд условного оператора?:;
  • предикат в объявлении static_assert;
  • выражение в спецификаторе noexcept;
  • выражение в явном спецификаторе;(начиная с C ++ 20)
  • предикат атрибута контракта.(начиная с C ++ 20)

Это означает, что для if (b2), b2 будет неявно преобразовано в bool с помощью B::operator bool(), даже если оно объявлено как explicit.

...