Недавно я наткнулся на что-то странное: преобразование логического в указатель работает в Visual Studio 2013 и 2015, но не в GCC или Clang (в 3.5).
#include <iostream>
using namespace std;
void foo(int *ptr)
{
std::cout << "foo";
}
int main()
{
foo(false);
}
Ошибка GCC:
main.cpp: In function 'int main()':
main.cpp:13:13: error: cannot convert 'bool' to 'int*' for argument '1' to 'void foo(int*)'
foo(false);
^
Я предполагаю, что false преобразуется в 0, что эквивалентно NULL. Замена вызова foo на foo(true)
приводит к сбою компиляции с каждым компилятором.
Итак, мой вопрос: должен ли этот код компилироваться? Я не вижу преимущества преобразования false в указатель, мне кажется, что это будет только причиной ошибок после неправильного использования/рефакторинга и т.д.