Есть несколько предметов, которые я уже обнаружил, которые не написаны в стандарте. Например, это не будет работать:
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 (ну, его реализация) завершился неудачей, потому что у лямбда-типа нет result_of typedef. Именно поэтому вы предоставляете тип возвращаемого значения для вызова bind, но, по-видимому, он по какой-то причине игнорирует его и продолжает поиск самостоятельно. Буст-версия bind работает как положено. По этой причине мы продолжаем использовать улучшенную версию 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 также нет declval. Хотя достаточно легко сделать:
<code>
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)
{
...
}
Вы также заметите, что на странице, на которую я ссылался выше, я уже обсуждал с членами команды разработчиков (или PR-частью или кем-то еще), что в 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 могут его нарушить.