crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Баги компилятора MSVS 2013, новая студия - новые баги
Iron Bug
  опции профиля:
сообщение 6.11.2013, 18:19
Сообщение #1


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Поставила я триальную студию MSVS 2013 Ultimate (Express нагло заявил, что моя венда, 7-ка 64 бит - "устаревшая", хотя все апдейты установлены, и не стал ставиться наотрез, как я ни старалась). Ну и хрен с ним, пока я использую триальную, чтобы понять, можно/нужно ли переходить на неё.
Конечно нужно, по идее. Вроде Майкрософт провозгласил, что в 2013 студии будет поддержка С++11 (лучше поздно, чем никогда :) ). Но вот тут сразу обнаружился баг, который как-то умерил мой позитивный настрой относительно MSVS 2013.

Проблема первая: вместо SDK, с набором заголовочников и библиотек, как положено (как было до 2010 студии включительно, например, в SDK 7.0A), в SDK теперь лежит нечто невнятного вида и непонятного содержания. То есть, использовать это нечто вместе со сторонними средствами разработки (вроде Code::Blocks) либо невозможно, либо затруднительно. Я пока не нашла метод, как заставить новый компилятор жрать это нечто, которое теперь лежит в SDK вместо привычных библиотек и заголовочников, из командной строки. Возможно, я всё-таки доковыряю этот вопрос. Это не фатально, хотя самой студией я пользоваться не люблю.

Фатально другое. Я в первый же день использования новой студии, на первом же проекте наступила в какашку: нашла странный баг с variadic templates.
Баг заключается в следующем: parameters pack предполагает несколько параметров, причём ноль (отсутствие) параметров тоже считается подходящим шаблону. Это по стандарту. На деле, когда берёшь простой пример, например:
class foo {
public:
    template <class T, class... Other>
    foo(T param, Other ...other) { }
};

int main()
{
    foo bar(10);
}

Всё хорошо компилится, как и следовало ожидать. Отсутствие аргументов у parameters pack - это нормально, это соответствует стандарту. И это работает правильно.

А теперь делаем маленькую модификацию, т.н. perfect forwarding c rvalue-ссылками (полезная и необходимая фича при форварде сложных типов):
class foo {
public:
    template <class T, class... Other>
    foo(T&& param, Other&& ...other) { }
};

int main()
{
    foo bar(10);
}

И вот тут программиста подстерегает баг: код не компилируется!
Почему? Потому что копилятор создаёт свой конструктор копии типа foo::foo(const foo& copy) и дальше просто игнорирует законный юзерский темплейт-конструктор. Зато пытается привести десятку к типу const foo&, на чём, собственно, и обламывается. С какого хрена он его игнорирует, мне пока непонятно. Но самое смешное (и печальное) заключается в том, что никак нельзя сказать компилятору выкинуть свои самодельные конструкторы на помойку. Оказалось, что майкрософт просто игнорирует декларацию =delete, например. И код
class foo {
...
foo(const foo&)=delete;
...
};

вас не спасёт.
И не спасёт даже объявление конструктора копии приватным членом класса! Что вообще как-то плохо согласуется с логикой. Код всё равно не компилируется.
Такая вот фигня. И как её обойти - я не знаю. Похоже, надо ждать ещё года два, пока Майкрософт выпустит пару десятков патчей и доведёт компилятор до рабочего состояния :)

Остальные проверенные мною компиляторы понимают этот код нормально, без каких-то особых затруднений. Этот глюк касается только Майкрософта, MSVS 2013.

Сообщение отредактировал Iron Bug - 6.11.2013, 19:40
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 6.11.2013, 20:30
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Ну да, в конце ты сама сказала, что microsoft обычно отстает симимильными шагами от других компиляторов! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 6.11.2013, 21:12
Сообщение #3


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(ViGOur @ 6.11.2013, 23:30) *
Ну да, в конце ты сама сказала, что microsoft обычно отстает симимильными шагами от других компиляторов! :)

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

а что касается "отставания": это не та контора, которая не может написать компилятор С++. а если вдруг не может... ну, значит, там совсем уж всё плохо.
но, скорее всего, это не так. это политика. пропихивают С#. например, вместо нормальной поддержки С++ они выпустили стопицот дотнетов. уже 4.5.1 версия последнего! а они один хрен не получили распространения :) я думаю, что тормоза с копилятором С++ - это способ продвижения С#, вкупе с мелкими, но вполне заметными пакостями типа:
1. отмены дебаггера с командной строкой, чтобы лишить разработчиков стороннего софта дебага: дебаг встроен а студию намертво. совершенно нелогично и необоснованно закрыт их собственный проект дебага из консоли. много лет поддерживался, в потом раз - и нету! казалось бы: просто так? :huh:
2. сейчас они убрали доступ к SDK: вместо понятного набора утилит, который раньше просто устанавливался распаковкой из архива, сейчас это какой-то монстр, который...
a. не работает без студии и даже не устанавливается отдельно.
b. не даёт возможности использовать его в сторонних программах, фактически. хотя позиционируется, как бесплатное средство разработки.
3. насчёт Express, которая не установилась по непонятным причинам: это не только у меня. вся сеть полна сообщениями о проблемах. думаешь, это беспокоит менеджеров мелкософта? да, Express не ставится. зато Ultimate ведь превосходно ставится! ;)
4. да и та же студия требует целой кучи совершенно ненужного (на первый взгляд) софта: IE, пакетов MS Office, последней венды вроде восмёрки... это жжжж неспроста! ;)

В общем, это и многое другое, по мелочам, подсказывает мне, что у них там давно не пахнет программированием. это чисто бабловытрясательная контора. они пытаются навязывать свои продукты всеми методами. и продавливают свои технологии. правда, с конкуренцией их сильно подвинули на рынке. а они всё ещё делают вид, что им всё пофиг. посмотрим, чем это закончится. Ведь, например, MinGW-w64 качается за пару минут, весит пару мегабайт и поддерживает С++11 совершенно бесплатно :)

Сообщение отредактировал Iron Bug - 6.11.2013, 22:25
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 7.11.2013, 12:53
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Iron Bug, а компилятор , случайно, не принимает && за булевый оператор ? Может, пробел нужно ?

2008 студия, правда. пищит, что error C2529: 'param' : reference to reference is illegal

Сообщение отредактировал Алексей1153 - 7.11.2013, 12:55
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 7.11.2013, 20:05
Сообщение #5


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(Алексей1153 @ 7.11.2013, 15:53) *
Iron Bug, а компилятор , случайно, не принимает && за булевый оператор ? Может, пробел нужно ?

если это так - то санитаров надо вызывать к тому, кто писал компилятор. :)
Цитата(Алексей1153 @ 7.11.2013, 15:53) *
2008 студия, правда. пищит, что error C2529: 'param' : reference to reference is illegal

студия 2008 - вообще позапрошлый век. там про С++11 мелкософт даже не думал, хотя он уже был вполне развит.

Сообщение отредактировал Iron Bug - 7.11.2013, 20:05
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 11.11.2013, 1:01
Сообщение #6


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Кстати, ещё в MSVS 2013 меня огорчила убогая реализация std::chrono и её взаимодействие с std::thread. При тестировании выяснилось, что минимальное время слипа - миллисекунда! Более мелкие таймеры кажут полную лажу, а поток по ним не спит, а сразу выходит из слипа. Миллисекунды - это ужасно.
Попробую попозже собрать буст с новым компилятором. Погляжу, как в бусте получится. Раньше (под студией 2010) он, по крайней мере, микросекунды выдавал под вендой.

Сообщение отредактировал Iron Bug - 11.11.2013, 1:02
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 27.11.2013, 8:06
Сообщение #7


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(Iron Bug @ 7.11.2013, 0:12) *
2. сейчас они убрали доступ к SDK: вместо понятного набора утилит, который раньше просто устанавливался распаковкой из архива, сейчас это какой-то монстр, который...

внесу поправку, чтобы не было дезинформации: SDK всё-таки есть. просто он теперь лежит совсем в другом месте. теперь он в
Цитата
c:\Program Files (x86)\Windows Kits\8.1

И надо подкаталоги этого пути добавлять в проекты, если собирать код не в студии.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.4.2024, 18:29