Почему это не скомпилируется?
Эта строка кода:
sample s = new oops;
эквивалентно написанию:
sample s = sample(new oops);
В C ++ 11 и C ++ 14 это неявно вызывает конструктор перемещения (или конструктор копирования, если конструктор перемещения недоступен). Поскольку компиляторам разрешено исключать копии и перемещения, фактическое перемещение исключается и ничего не отображается при вызове конструктора перемещения. Несмотря на то, что фактическое перемещение не выполняется, программам не разрешается ссылаться на удаленные функции даже неявно , поэтому есть ошибка компилятора.
Это можно исправить, изменив инициализацию на
sample s { new oops };
или
sample s ( new oops );
или, если вы действительно хотите использовать =
, вы можете воспользоваться временным продлением жизни для записи
// s won't get destroyed until the end of the scope
// it's safe to use s after this statement
sample&& s = new oops;
Что меняет C ++ 17?
C ++ 17 внес некоторые изменения в набор объектов категорий значений. В C ++ 17 sample(new oops)
становится prvalue, а стандарт c ++ 17 требует, чтобы компиляторы требовали получения prvalue на месте без копирования или перемещения их. Это делается с помощью комбинации темной магии и колдовства.
Это означает, что
sample s = new oops;
законно в c ++ 17.
Почему при добавлении -std=c++17
?
он все еще не компилируется
Этот код должен компилироваться в C ++ 17 , и ошибка, которую вы получаете, происходит из-за того, что gcc 6.3 и более ранние версии не реализуют эту часть стандарта c ++ 17. Эта проблема была исправлена в gcc 7.1 , и код будет скомпилирован должным образом.