Почему lambda конвертируется в bool, значение которого истинно? - программирование
Подтвердить что ты не робот

Почему lambda конвертируется в bool, значение которого истинно?

#include <iostream>

void IsTrue(const bool value) {
  if (value) {
    std::cout << "value is True!\n";
  }
}

int main()
{
  IsTrue([]() { ; /* some lambda */ });

  return 0;
}

Вывод:

value is True!

Почему лямбда оценивается до true на GCC и Clang? MSVC не может построить это (не может преобразовать lambda в bool).

Это ошибка компилятора? Или какой пункт стандарта позволяет это?

4b9b3361

Ответ 1

В стандарте С++ 14 (§5.1.2) говорится:

Тип замыкания для не-общего лямбда-выражения без lambda-capture имеет публичное не виртуальное неявное преобразование const для указателя на функцию с привязкой языка С++ (7.5) с теми же параметрами и типами возврата, что и типы закрытия оператор вызова функции. Значение, возвращаемое этой функцией преобразования должен быть адресом функции, которая при вызове имеет тот же эффект, вызывающий оператор вызова функции замыкания.

Так как указатель функции неявно конвертируется в bool, вы получаете результат, который вы показали. Это совершенно законно.

MSVC не компилирует это, потому что этот оператор преобразования перегружен различными соглашениями о вызовах (__stdcall, __cdecl и т.д.). При компиляции для x64 все эти вызывающие соглашения не используются, поэтому есть только один оператор преобразования, и он компилируется отлично.