Я должен использовать C++ 0x Функции Теперь?

С официальным релизом VS 2010 для меня действительно ли безопасно начать использовать частично реализованный C++ 0x набор функций в моем новом коде?

Опции, которые представляют интерес для меня прямо сейчас, и реализованы VC ++ и последние версии 2010 года GCC. Это только два, что я должен поддерживать.

С точки зрения "безопасности", упомянутой в первом предложении: я могу начать использовать эти функции (например, функции лямбды) и все еще быть гарантирован, тот мой код скомпилирует через 10 лет на компиляторе, который правильно соответствует C++ 0x, когда он официально выпущен?

Я предполагаю, что спрашиваю, существует ли шанс, что VC ++ 2010 или GCC закончится как VC ++ 6; это было выпущено, прежде чем язык был официально стандартизирован и следовательно позволен чрезвычайно плохо сформированный код для компиляции.

В конце концов, Microsoft действительно заявляет, что "10 новые 6".;)

22
задан Zach Johnson 17 April 2010 в 02:20
поделиться

6 ответов

Я уже обнаружил несколько элементов, которые не соответствуют стандарту. Например, это не сработает:



struct test {
  int operator()(int);
};

std::cout << typeid( std::result_of<test(int)>::type ).name() << std::endl;

Согласно сайту википедии о C ++ 0x, должно. По-видимому, VS2010 использует определение TR1 для result_of, которое отличается от того, что будет в C ++ 0x (на основе decltype).

Кроме того, это не работает:



std::bind<int>([](int i)->int {return i; });

Это не работает, потому что вызов std :: result_of (ну, его реализация) завершается неудачно, потому что лямбда-тип не имеет typedef result_of. Конечно, именно поэтому вы указываете тип возвращаемого значения для вызова привязки, но, очевидно, он по какой-то причине игнорирует его и продолжает поиск сам по себе. Ускоренная версия связывания работает должным образом. По этой причине мы продолжаем использовать ускоренную версию bind в нашем проекте.

Также обратите внимание на http://blogs.msdn.com/vcblog/archive/2010/04/06/c-0x-core-language-features-in-vc10-the- table.aspx? CommentPosted = true # commentmessage , что в VS2010 еще предстоит реализовать некоторые изменения, которые повлияют на лямбда-выражения. Мне не удалось их сломать, но тогда я не использовал вложенные лямбды и, вероятно, никогда не буду.

Вы также должны помнить, что boost :: shared_ptr и std :: shared_ptr несовместимы. Неудивительно, но вы должны знать это, если собираетесь использовать один или другой ... Я бы не рекомендовал оба, и мы просто будем придерживаться ускорения.

В VS2010 также нет объявления. Однако сделать это достаточно просто:


template < typename T > T&& declval();

Пример использования:


template < typename T >
struct point
{
  T x,y;
};

template < typename T1, typename T2 >
point<decltype(declval<T1>() + declval<T2>())> operator + (point<T1> const& lh, point<T2> const& rh)
{
 ...
}

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


template < typename T1, typename T2 >
auto operator + (point<T1> const& lh, point<T2> const& rh)
  -> point<decltype(lh.x + rh.x)>
{
...
}
point<int> x; point<double> y;
point<double> pt = x + y; // fails, operator + returned point<const double>

void f();
auto ptr = &f;

std::cout << typeid( decltype(*ptr) ).name() << std::endl;
std::cout << typeid( decltype(*&f) ).name() << std::endl; // should output the same thing...outputs void (*)()

Также ... согласно некоторым электронным письмам о decltype и result_of, это должно сработать:



std::result_of< decltype(f)() >::type x = f();

С моей домашней версией std :: result_of, что использует decltype, это будет работать, если выражение decltype (f) () работает правильно. Это не.Выдает некоторую ошибку о функции, возвращающей функцию. Вы должны использовать «decltype (& f) ()», чтобы выражение работало.

Итак, конечно ... мы его используем. Хотя есть некоторые баги и хрень. Преимущества перевешивают ожидание ИМХО. Не ожидайте, что ваш код будет стандартным, когда стандарт выйдет, хотя будущие компиляторы MS могут его сломать.

14
ответ дан 29 November 2019 в 05:29
поделиться

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

0
ответ дан 29 November 2019 в 05:29
поделиться

Набор функций C++0X уже достаточно фиксирован, так что я бы сказал, что надо соглашаться. Окончательный проект предложения должен быть готов в августе, согласно Википедии.

Многие вещи доступны в boost в любом случае (фактически, многие вещи 0X пришли из boost) - см. boost TR1. Вы можете повторно использовать эти возможности через boost, даже если компилятор не полностью C++0X.

11
ответ дан 29 November 2019 в 05:29
поделиться

Если вы ожидаете, что ваш код будет нетронутым в течение многих лет, и хотите, чтобы он без вмешательства сохранял изменения компилятора, я бы посоветовал вам придерживаться C ++ 98/03 .

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

0
ответ дан 29 November 2019 в 05:29
поделиться

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

Хорошую таблицу со списком поддержки функций можно найти здесь . Лично auto переменные, ссылки на r-значения и лямбда-выражения - довольно большие возможности для использования и хорошо поддерживаются.

1
ответ дан 29 November 2019 в 05:29
поделиться

Думаю, я спрашиваю, есть ли шанс, что VC ++ 2010 или GCC превратятся в VC ++ 6; он был выпущен до того, как язык был официально стандартизирован и, следовательно, позволил скомпилировать крайне плохо сформированный код.

Это возможно, но очень маловероятно, ИМХО. Не только MS, но и другие поставщики компиляторов уже поддерживают некоторые функции C ++ 0x, и я ожидаю, что Комитет по стандартизации будет крайне осторожен в отношении нарушения совместимости на данном этапе.

0
ответ дан 29 November 2019 в 05:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: