Почему & lt; вместо & lt; & lt; в потоке вывод еще компилировать?

Сегодня я сделал небольшую опечатку в своей программе и странствовал, почему я не получил никакого вывода, хотя программа скомпилировалась нормально. В основном это сводится к этому:

#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 по-прежнему принимает его.

11

Решение

Да, компилятор конвертирует 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,

9

Другие решения

Это действительно только до C ++ 11.

Вы в основном делаете: ((void *) std::cout) < ((char *) "test")

5

По вопросам рекламы ammmcru@yandex.ru