Преобразование оператора void * () по-прежнему является частью библиотеки C ++?

Рассмотрим эту программу:

#include <iostream>
int main()
{
    delete std::cout;
}

AFAIK функция преобразования operator void * () const была удалена из С ++ 11. Таким образом, эта программа должна потерпеть неудачу при компиляции на компиляторе C ++ 11. Да, это правда, что оба g ++ 4.8.1 и 4.9.2 дают диагностику (в виде предупреждения о том, что удаление void * не определено, и это тоже хорошо). Но не должна ли эта программа терпеть неудачу при компиляции из-за удаления этой функции преобразования, из-за которой весь объект потока мог быть неявно преобразован в void * в C ++ 98 и C ++ 03 ?. Это ошибка? Кажется немного удивительным, что они до сих пор не реализовали это изменение.

Я пробовал эту программу в g ++ 4.9.2 (которая поддерживает C ++ 14), но она выдает предупреждение, а не ошибку компилятора. Компилятор Ideone выдает ошибку, как и ожидалось. (См. Живую демонстрацию здесь)


person Destructor    schedule 16.08.2015    source источник
comment
Компилятор Ideone на самом деле GCC 5.1   -  person Piotr Skotnicki    schedule 16.08.2015
comment
@PiotrSkotnicki: Вопрос не в этом. Вопрос в том, почему программа все еще компилируется в g ++ 4.8.1 и 4.9.2?   -  person Destructor    schedule 16.08.2015


Ответы (2)


Это не имеет ничего общего с компилятором, это проблема библиотеки. libstdc ++ имеет множество несовместимостей с C ++ 11, из которых это только одна. Они вносят критические изменения в версии 5 и выше, хотя iirc.

Короче говоря, это не ошибка и не проблема компилятора.

person Puppy    schedule 16.08.2015

Это ошибка стандартной библиотеки (если вы рассматриваете ее как реализацию стандартной библиотеки C ++ 11/14, а не C ++ 98/03).

Хотя это тоже проблема компилятора. В частности, удаление преобразования в void * зависит от добавления преобразования непосредственно в _2 _--, но это, в свою очередь, зависит от добавления «контекстного преобразования» к компилятору.

В gcc 4.8 была реализована форма контекстного преобразования, но не форма, принятая в стандарте. Хотя конкретные изменения в контекстном преобразовании не напрямую повлияют на это использование контекстного преобразования, это указывает на тот факт, что определение контекстного преобразования все еще изменялось при написании этих компиляторов.

Последовательность, в которой что-то (по крайней мере обычно) происходит, заключается в том, что сначала утверждается спецификация. Затем компилятор реализует это. Затем стандартная библиотека применяет его.

В этом случае спецификация все еще изменялась незадолго до выпуска компилятора. Следовательно, стандартная библиотека не использовала (и практически не могла) ее использовать.

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

person Jerry Coffin    schedule 16.08.2015