![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
Iron Bug |
![]() ![]()
Сообщение
#1
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
Поставила я триальную студию MSVS 2013 Ultimate (Express нагло заявил, что моя венда, 7-ка 64 бит - "устаревшая", хотя все апдейты установлены, и не стал ставиться наотрез, как я ни старалась). Ну и хрен с ним, пока я использую триальную, чтобы понять, можно/нужно ли переходить на неё.
Конечно нужно, по идее. Вроде Майкрософт провозгласил, что в 2013 студии будет поддержка С++11 (лучше поздно, чем никогда ![]() Проблема первая: вместо SDK, с набором заголовочников и библиотек, как положено (как было до 2010 студии включительно, например, в SDK 7.0A), в SDK теперь лежит нечто невнятного вида и непонятного содержания. То есть, использовать это нечто вместе со сторонними средствами разработки (вроде Code::Blocks) либо невозможно, либо затруднительно. Я пока не нашла метод, как заставить новый компилятор жрать это нечто, которое теперь лежит в SDK вместо привычных библиотек и заголовочников, из командной строки. Возможно, я всё-таки доковыряю этот вопрос. Это не фатально, хотя самой студией я пользоваться не люблю. Фатально другое. Я в первый же день использования новой студии, на первом же проекте наступила в какашку: нашла странный баг с variadic templates. Баг заключается в следующем: parameters pack предполагает несколько параметров, причём ноль (отсутствие) параметров тоже считается подходящим шаблону. Это по стандарту. На деле, когда берёшь простой пример, например:
Всё хорошо компилится, как и следовало ожидать. Отсутствие аргументов у parameters pack - это нормально, это соответствует стандарту. И это работает правильно. А теперь делаем маленькую модификацию, т.н. perfect forwarding c rvalue-ссылками (полезная и необходимая фича при форварде сложных типов):
И вот тут программиста подстерегает баг: код не компилируется! Почему? Потому что копилятор создаёт свой конструктор копии типа foo::foo(const foo& copy) и дальше просто игнорирует законный юзерский темплейт-конструктор. Зато пытается привести десятку к типу const foo&, на чём, собственно, и обламывается. С какого хрена он его игнорирует, мне пока непонятно. Но самое смешное (и печальное) заключается в том, что никак нельзя сказать компилятору выкинуть свои самодельные конструкторы на помойку. Оказалось, что майкрософт просто игнорирует декларацию =delete, например. И код
вас не спасёт. И не спасёт даже объявление конструктора копии приватным членом класса! Что вообще как-то плохо согласуется с логикой. Код всё равно не компилируется. Такая вот фигня. И как её обойти - я не знаю. Похоже, надо ждать ещё года два, пока Майкрософт выпустит пару десятков патчей и доведёт компилятор до рабочего состояния ![]() Остальные проверенные мною компиляторы понимают этот код нормально, без каких-то особых затруднений. Этот глюк касается только Майкрософта, MSVS 2013. Сообщение отредактировал Iron Bug - 6.11.2013, 19:40 |
|
|
![]() |
Алексей1153 |
![]()
Сообщение
#2
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
Iron Bug, а компилятор , случайно, не принимает && за булевый оператор ? Может, пробел нужно ?
2008 студия, правда. пищит, что error C2529: 'param' : reference to reference is illegal Сообщение отредактировал Алексей1153 - 7.11.2013, 12:55 |
|
|
Iron Bug |
![]()
Сообщение
#3
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
Iron Bug, а компилятор , случайно, не принимает && за булевый оператор ? Может, пробел нужно ? если это так - то санитаров надо вызывать к тому, кто писал компилятор. ![]() 2008 студия, правда. пищит, что error C2529: 'param' : reference to reference is illegal студия 2008 - вообще позапрошлый век. там про С++11 мелкософт даже не думал, хотя он уже был вполне развит. Сообщение отредактировал Iron Bug - 7.11.2013, 20:05 |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 8.6.2025, 10:54 |