С++ 0x - экспорт ушел, спецификации исключений устарели. Это повлияет на ваш код?

Этот последний Отчет о трафике Herb Sutter в процессе стандартизации С++ 0x указывает, что комитет решил полностью отказаться от "экспорта" концепцию шаблонов и отклонение спецификаций исключений.

Я думаю, что это оба хорошие шаги, но мне интересно, есть ли у кого там база кода, где эти изменения вызовут бессонные ночи?

Ответ 1

Я программировал на С++ с момента создания cfront 1.0, и я рад сказать, что я никогда не писал спецификацию исключения или не допускал, чтобы в коде, за который я был ответственен. Когда они были предложены, я позвонил Бьярне Страуступ по телефону и заплакал: "Не делай этого!" Я дал все причины, почему они были ужасной идеей. К моему удивлению, он сказал что-то вроде: "Я знаю". Когда я спросил, почему функция от Hades входит в спецификацию, он сказал, что есть большой игрок, чьи "эксперты" решительно настаивали на том, что он должен был войти в спецификацию, или они абсолютно не подписались, период, конец обсуждения, Если бы я знал, кто это, я забыл.

Я устал долгое время.: -)

Ответ 2

Разумеется, бессонные ночи ни на одном из кодовых оснований, с которыми я занимался в течение последних 5-6 лет. Я не думаю, что когда-либо сталкивался с кем-либо, кто использовал export, плюс такие эксперты, как Herb Sutter, до сих пор отказывались от спецификаций исключений (кроме nothrow), что большинство программистов уже получили сообщение.

Ответ 3

export никогда не выполнялся должным образом в gcc или MSVC (но, по-видимому, это было так в EDG/Comeau, как говорят комментарии), но я предполагаю, что он никогда не получил широкого признания. (Но я в основном живу в мире gcc/msvc, поэтому моя точка зрения не охватывает все сообщество С++.)

Что касается спецификаций исключений, я считаю, что они тоже были сломаны.

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

Ответ 4

Я, конечно, не пролью слезу за спецификацией исключения. ( "Хорошая идея, которая, к сожалению, никогда не срабатывала" ). Все, что им когда-либо нравилось, было тем, что сейчас означает noexcept.

Но я надеялся, что export сделает это. Как минимум, export позволит вам изменять вспомогательные функции для шаблонов, не перекомпилируя весь код с помощью этих шаблонов. И это избавит нас от всех тех detail пространств имен:

namespace detail { // actually we don't want this public, but can't avoid it
  template<typename T>
  void f_helper() { /*---*/ }
}

template<typename T>
void f() {detail::f_helper();}

void g() {f<int>();} // has to recompile if f_helper() implementation changes

Увы, поскольку только один из компиляторов, который я должен был использовать в течение последнего десятилетия, когда-либо реализовывал его, я никогда не смог бы использовать его.

Ответ 5

Я думаю, что оба движения хороши, и я не причиню мне никакой боли, и мне нравится разъяснение намерения относительно noexcept.

Ответ 7

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