Сегодня я сделал небольшую опечатку в своей программе и странствовал, почему я не получил никакого вывода, хотя программа скомпилировалась нормально. В основном это сводится к этому:
#include <iostream>
int main()
{
std::cout < "test"; // no << but <
}
Я абсолютно не знаю, какое неявное преобразование выполняется здесь, поэтому программа все еще компилируется (как g ++ 4.9.2, так и даже g ++ 5). Я только что понял, что Clang ++ отклоняет код. Есть ли преобразование в void*
выполняется (не может думать ни о чем другом)? Я помню, что видел что-то подобное, но я думал, что это было решено в g ++ 5, но, похоже, это не так.
РЕДАКТИРОВАТЬ: Я не собирался -std=c++11
таким образом, код был действителен до C ++ 11 (из-за преобразования в void*
из ostream
). При компиляции с -std=c++11
g ++ 5 отклоняет код, g ++ 4.9 по-прежнему принимает его.
Да, компилятор конвертирует cout
к void*
, Если вы используете -S
переключитесь, чтобы получить разборку кода, вы увидите что-то вроде этого:
mov edi, OFFSET FLAT:std::cout+8
call std::basic_ios<char, std::char_traits<char> >::operator void*() const
cmp rax, OFFSET FLAT:.LC0
setb al
test al, al
Что дает понять, что operator void*
виновник
Вопреки тому, что сказал Билл Линч, я могу воспроизвести это с —std=c++11
на Проводник компилятора. Тем не менее, это, кажется, дефект реализации, так как C ++ 11 должен был заменить operator void*
с operator bool
на basic_ios
,
Это действительно только до C ++ 11.
Вы в основном делаете: ((void *) std::cout) < ((char *) "test")