LINUX.ORG.RU

C++ 17 формально заапрувили

 


2

5

Поискал поиском, еще не было?

Пруф: https://herbsutter.com/2017/09/06/c17-is-formally-approved/

Из Википедии:

  • Стандартная библиотека языка Си была обновлена и адаптирована с версии C99 до C11;
  • Добавления текстового сообщения по-умолчанию для static_assert;
  • Удаление триграфов;
  • Использование typename в параметрах шаблона, находящегося внутри параметров другого шаблона;
  • Новые правила вывода типа для auto из списка инициализации (std::initializer_list);
  • std::uncaught_exceptions, как замена std::uncaught_exception;
  • Определение вложенных пространств имён: namespace A::B {};
  • Атрибуты для перечислений и пространств имён;
  • Символьные литералы UTF-8;
  • Оценка константности для всех нетипизированных аргументов шаблонов;
  • Упакованные выражения template<typename... As> void foo(As... args) { return (args && ...); } ;
  • Новые методы вставки для std::map и std::unordered_map;
  • Унифицированный доступ к размеру контейнеров std::size();
  • Определение «Смежный итератор»;
  • Удаление некоторых устаревших типов и функций, например, таких как std::auto_ptr, std::random_shuffle или старых функциональных адаптеров;
  • Библиотека файловой системы, основанная на boost::filesystem;
  • Параллельные версии алгоритмов STL;
  • Некоторые математические функции;
  • Большую часть экспериментальной библиотеки TS I.
  • Новый синтаксис для распаковки пар, кортежей и прочих типов, для которых реализован std::get. Например: auto x = std::make_tuple(4,6,7); auto [a,b,c] = x;
  • Инициализация переменной в if и switch. Например: if(auto a = getA(); a.isValid()) {}
  • Автоматический вывод аргументов шаблона класса; также поддерживается ручное указание правил вывода.
★★★★☆

Последнее исправление: stevejobs (всего исправлений: 1)
Ответ на: комментарий от JacobTwoTwo

не могу удолить уже

олсо, вот поясните за всё это

удаление std::auto_ptr

но ведь половина мира сразу же сломается от этого?

stevejobs ★★★★☆
() автор топика
Ответ на: комментарий от stevejobs

Ну х.з. Я всякими смартпоинтерами и т.п. ЕЩЁ не начинал пользоваться. Как-то не было необходимости. А их потихоньку уже выбрасывают. Правду говорят: «Поспешишь — людей насмешишь»:)

JacobTwoTwo
()
Ответ на: комментарий от RazrFalcon

почему его почти никто не юзал? с ним что-то не так?

олсо, вот еще: «Инициализация переменной в if и switch. Например: if(auto a = getA(); a.isValid()) {}»

господи, люди годами боролись чтобы запретить вообще операцию присваивания там, в разных языках, и вот 2017 года и мы видим автор внутри ифа

WAAAT?

stevejobs ★★★★☆
() автор топика

Определение вложенных пространств имён: namespace A::B {};

Теперь не обязательно писать так?

namespace A
{
  namespace B
  {
  }
}

Атрибуты для перечислений и пространств имён;

Что это?

Унифицированный доступ к размеру контейнеров std::size();

Вместо std::vector<T> v; v.size(); можно написать std::vector<T> v; std::size(v);? И, наверное, можно так: T v[some_size]; std::size(v);?

andreyu ★★★★★
()
Ответ на: комментарий от stevejobs

auto_ptr уже уйму времени как deprecated в пользу unique_ptr.

anonymous
()
Ответ на: комментарий от stevejobs

но ведь половина мира сразу же сломается от этого?

Эта половина мира продолжит собираться даже без -std=c++11. Другая половина мира проведет небольшой рефакторинг там, где это нужно.

andreyu ★★★★★
()
Ответ на: комментарий от stevejobs

почему его почти никто не юзал? с ним что-то не так?

С std::auto_ptr<T> много что не так. Потому и появился std::unique_ptr<T>.

andreyu ★★★★★
()
Ответ на: комментарий от stevejobs

с ним что-то не так?

Он бесполезный. Тем более теперь есть unique_ptr.

люди годами боролись чтобы запретить вообще операцию присваивания там

Вы что-то путаете.

RazrFalcon ★★★★★
()
Ответ на: комментарий от andreyu

нейм спейс теперь не нужно будет лесенки плодить

std::size ко всем коннейнерам, раньше не у всех был

anonymous
()
Ответ на: комментарий от andreyu

Теперь не обязательно писать так?

да

Что это?

enum E {
  foobar = 0,
  foobat [[deprecated]] = foobar
};

E e = foobat; // Emits warning

namespace [[deprecated]] old_stuff{
    void legacy();
}

old_stuff::legacy(); // Emits warning

И, наверное, можно так:

https://isocpp.org/files/papers/n4280.pdf

stevejobs ★★★★☆
() автор топика
Ответ на: комментарий от stevejobs

[[deprecated]]

Полезный атрибут, известный еще со времен c++11. Им удобно было маркировать устаревший итерфейс, если нельзя было жестко ломать совместимость.

andreyu ★★★★★
()
Ответ на: комментарий от JacobTwoTwo

Но я не уверен, что это стоит тянуть в язык.

Направьте запрос в комитет.

Эта фича органичней смотрелась бы в какой-то IDE, чем в самом языке.

Впрочем, не стоит отправлять такой запрос.

andreyu ★★★★★
()
Ответ на: комментарий от JacobTwoTwo

Уроки на понедельник сделал или опять скажешь, что «ничего не задали»?

anonymous
()
Ответ на: комментарий от stevejobs

Чтобы осознать, что не так с auto_ptr, достаточно беглого взгляда на описание:

  • Нет поддержки кастомного deleter'a.
  • Нет поддержки move-семантики.
  • Несовместим со стандартными контейнерами.
anonymous
()
Ответ на: комментарий от anonymous

ваще говоря, в IntelliJ IDEA есть похожая фича для джавы: https://www.jetbrains.com/help/idea/using-external-annotations.html

можно в отдельном XML-файле указать привязки: в каком классе и на что навешать аннотацию при сборке. Это позволяет не писать аннотации прямо в коде, чтобы они не попали в репозиторий.

Например, можно сделать аннотацию @ВасяКозел, и потом когда работаешь с приложением, если случилась ошибка там где поработал Вася - писать об этом в сообщении об ошибке (такой баг не нужно документировать, Вася - козел, и всё рано ничего не починит)

stevejobs ★★★★☆
() автор топика
Ответ на: комментарий от stevejobs

господи, люди годами боролись чтобы запретить вообще операцию присваивания там, в разных языках, и вот 2017 года и мы видим автор внутри ифа

Там не рандомное присваивание, а инициализация + условие.

Stil ★★★★★
()
Ответ на: комментарий от andreyu

С ним всё так. Просто мартышки не сумели им пользоваться.

Для непонятливых - это указатель на объект со временем жизни текущего скоупа. Но хвостатые захотели использовать его как-то иначе.

unique_ptr спроектирован с меньшим количеством вариантов неправильного использования, да.

dzidzitop ★★
()
Последнее исправление: dzidzitop (всего исправлений: 2)
Ответ на: комментарий от stevejobs

олсо, вот еще: «Инициализация переменной в if и switch. Например: if(auto a = getA(); a.isValid()) {}»

Примерчик так себе, ведь можно if(getA().isValid())

Есть какие-то реальные юзкейсы?

Crocodoom ★★★★★
()

Параллельные версии алгоритмов STL;

Неплохо. Вот бы еще и параллельные версии контейнеров завезли, ну и алгоритмов побольше. Как в java.util.concurrent.

userd
()
Ответ на: комментарий от Crocodoom

Примерчик так себе, ведь можно if(getA().isValid())
Есть какие-то реальные юзкейсы?

Да:

if (auto p = get(); p != nullptr)
{
  p->foo();
  return true;
}
return false;


А если внутри getV() выполняется некое вычисление, то все совсем печально.

andreyu ★★★★★
()
Ответ на: комментарий от stevejobs

А я говорил, что с++ захватили полудурки, одержимые «выразительностью» и «парадигмами». Это их братия регулярно пишалась на лоре в частности и в интернетах вообще как в ихних языках можно «легко и удобно» херачить однострочники для олимпиадных задачек. Вот теперь они из c++ начали лепить сраный раст с перлом пополам

ckotinko ☆☆☆
()
Ответ на: комментарий от slapin

а разве хорошо, когда по коду нельзя определить тип переменной?

По коду видно, что это указатель. Но какое это имеет отношение к инициализации переменной в if и switch?

andreyu ★★★★★
()
Ответ на: комментарий от stevejobs

олсо, вот еще: «Инициализация переменной в if и switch. Например: if(auto a = getA(); a.isValid()) {}»

Это нужная фича :-) Ты вообще по область видимости слышал? :-) Так вот переменная «a» в твоём примере завершит своё существование при выходе из области видимости, определяемой if :-) В противном случае, при auto a = getA(); if (a.isValid()) {..}, a останется видима (и будет продолжать существовать, в чём, обычно, нет необходимости) после того, как отработает if :-)

anonymous
()
Ответ на: комментарий от Crocodoom

пример с мютексом-лок-анлок-гвард который нужно было выносить за if а теперь можно написать внутри

anonymous
()
Ответ на: комментарий от Crocodoom

Значение getA() может внезапно понадобиться в скопе оператора if?

theNamelessOne ★★★★★
()

Модули так и не завезли, расходимся.

Кстати, я не понял: событие обсуждается аж в двух ветках в Development, а новость так никто и не запилил.

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

а новость так никто и не запилил

Новость - это публикация стандарта.

anonymous
()

Кто-то в курсе, этот выпуск еще считают мажорным? Одни же слезы, только в библиотеку добавили немного полезного.

Больше похоже что мажорным будет C++20, чувак из яндекса говорил что туда метят концепты, модули и ranges.

anonymous
()
Ответ на: комментарий от stevejobs

f (getA() && getA().isValid())

Это будет работать только если getA() возвращает ссылку на один о тот же уже созданный объект :-) В частности, на какой-нибудь синглтон Мейерса :-) А вот, допустим, надо создать объект на стеке, время жизни которого ограничено областью видимости if :-) Например:

void foo(const std::size_t x)
{
  if (std::string s = bar(); s.size() < x) {
  } else if (s.size() > x + 1) {
  } else {
  }

  // s тут недоступен, вся память, занимаемая s уже освобождена.
  // ....
}
Т.е. это сахар над:
void foo(const std::size_t x)
{
  {
    std::string s = bar()
    if (s.size() < x) {
    } else if (s.size() > x + 1) {
    } else {
    }
  }
}
:-)

anonymous
()
Ответ на: комментарий от stevejobs

удаление std::auto_ptr но ведь половина мира сразу же сломается от этого?

Это еще что, от удаления триграфов сломается вообще всё!

А серьезно, auto_ptr еще до C++11 нирикомендовали гуру типа Майерса.

anonymous
()

А что насчёт resumable функций? Как по мне, самая вкусная фича, если её таки введут.

KivApple ★★★★★
()
Ответ на: комментарий от hobbit

ну совсем официально то еще нет такого, но совсем черновой стандарт уже готов

anonymous
()
Ответ на: комментарий от JacobTwoTwo

Ну х.з. Я всякими смартпоинтерами и т.п. ЕЩЁ не начинал пользоваться. Как-то не было необходимости. А их потихоньку уже выбрасывают. Правду говорят: «Поспешишь — людей насмешишь»:)

Добавил как комментарий к твоему профилю.

BruteForce ★★★
()
Ответ на: комментарий от stevejobs

почему его почти никто не юзал? с ним что-то не так?

Оно стало юзабельно когда подоспели unique_ptr и shared_ptr.

господи, люди годами боролись чтобы запретить вообще операцию присваивания там, в разных языках, и вот 2017 года и мы видим автор внутри ифа

Люто бешено плюсую. Каким нужно быть мудаком, что б внести это в стандарт?

Aswed ★★★★★
()
Ответ на: комментарий от Aswed

прежде чем возмущаться видимо надо ознакомится с предложением ? http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0305r0.html https://www.reddit.com/r/cpp/comments/4z155b/c17_if_statement_with_initializer/ где все ясно и понятно, язык С++ хорош тем что если вам это не нужно, то вы можете это не использовать

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.