Корректно или нет?

интересуюсь плюсами довольно давно... вообщем преамбулу отбросим,

нашёл баг еще в начале года в VS2017 (15.6.х) компилере (пофиксили буквально неделю назад в обнове 15.7.1)

баг в том что если есть например родительский класс с парой мемберов(неважно сколько и каких) и конструктором принимающим допустим 2 аргумента, то если с дочернего класса из constructor member initializer попытаться вызвать этот конструктор юниформно и не с 2мя аргументами а например с тремя, то есть derived() : base{1,2,3}{} то студийный компилер это спокойно хавал (в отличии от gcc и clang, и даже родного IntelliSense,который это место считал ошибочным), и на выходе получалось что базовый класс не проинициализирован а в дочернем всё ок. но это ладно, пофиксили и хорошо, просто

тут еще одна фантазия возникла:


#pragma pack(1)

struct _jGate

{

// due to initializers, added implicit ctor and called on creation

const unsigned char j_code = 0xEE;

unsigned int j_address;

const unsigned short int j_segment = 0x0033;

};

#pragma pack()


...

jGate stub{ 1}; // sets j_code member to 1, which is initially const.! Clang & gcc does same

// stub.j_code = 0xee; // error C3892: 'stub': you cannot assign to a variable that is const


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

(пс код и комменты писать по русски не могу - глаза режет)

Лига программистов C/C++

66 постов4.8K подписчиков

Правила сообщества

Соблюдайте правила Pikabu:

https://pikabu.ru/html.php?id=wtf


Помимо этого ЗАПРЕЩЕНО:

- Размещать в сообществе посты стиля "Подскажите как удалить вирус", "Подскажите как установить программу", "Подскажите как починить монитор/телевизор/мышь/тостер/стиральную машину" или "Напишите за меня лабу в универ". Пожалуйста размещайте такие посты вне этого сообщества или в соответствующих для этого сообществах.

Вы смотрите срез комментариев. Показать все
2
Автор поста оценил этот комментарий

Меня в последнее время вообще крайне бесит msvc количеством своих багов. Особенно в темплейтах. Как только начинаешь наворчивать что-нибудь чуть сложнее чем просто темплейтная коллекция, то сразу тут тебе и 'internal compiler error' с последующем крашем и 'optimizer crash' и просто ошибка компиляции, хотя его коллеги (gcc и clang) спокойно со всем этим делом справляются (вот например баг который я нашел у них https://stackoverflow.com/questions/50282217/parameter-pack-...).
Ладно, баги это одно.
А вот расширения которые майрософт придумали для компилятора вообще лютое зло. Потому что некоторый код становится крайне сложно использовать другим компилятором.
Ну например

class Vector3f

{

   public:

   union

   {

      float values[3];

      float x, y, z;

   };

};


void UseVector3f(Vector3f arg) {

   arg.values[0] = 1.0f;

   arg.x = 1.0f;

}


Вот такой вот анонимный юнион который выкидывает свои поля в класс в котором он объявлен будет работать только в msvc. Очень удобно. До тех пор пока это не нужно собрать другим компилятором (причин тому может быть много). Надо пройтись по всему коду и заменить x y и z на values[0], values[1], values[2] (или наоборот). А такие классы могут использоваться очень во многих местах.
На самом деле многие компиляторы поддерживают это, но это нужно включать отдельно.

Не знаю зачем все это написал, накипело прост

раскрыть ветку (19)
0
DELETED
Автор поста оценил этот комментарий
А как тебе неконстантные ссылки на rvalue?
от одного вида коробит...
int foo() { return 5; }
...
int &ref = foo();
раскрыть ветку (17)
0
Автор поста оценил этот комментарий

Прошу (g++ 4.8.5; VS2017 U2):


int foo() { return 10; }


int main()

{

int x = std::move(foo());

return 0;

}

раскрыть ветку (1)
0
DELETED
Автор поста оценил этот комментарий
Так ты тут создаёшь новую переменную, а не делаешь на неё ссылку
Можешь почитать всю ветку, мы там достаточно обсудили это
0
Автор поста оценил этот комментарий

Это не соберется поэтому никак.

раскрыть ветку (14)
0
DELETED
Автор поста оценил этот комментарий

Ладно, с простыми типами не работает
С другими собирается https://godbolt.org/g/iTeZy2

раскрыть ветку (13)
0
Автор поста оценил этот комментарий

подозреваю что с простыми не работает потому что через аккумулятор возврат идёт, т.е. то шо влязиет в sizeof(void*), а вот когда там чёнить структурное пожирнее - то всяко оно на стеке остаётся сверху после возврата с функи, затем копируется или юзается по ссылке ибо на тот момент стек будет ниже,но это догадка, надо дебаггером смотреть.

раскрыть ветку (1)
0
DELETED
Автор поста оценил этот комментарий

оберни простой тип в структуру - получишь такое же поведение
https://godbolt.org/g/dtuNNB

0
Автор поста оценил этот комментарий

чегото не пойму прикола, твои конверсейшны ко мне адресуются, да и в твоём профиле я вижу свою картинку

раскрыть ветку (2)
1
Автор поста оценил этот комментарий

Потому что это комметрии к твоему посту...

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

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

0
Автор поста оценил этот комментарий

Может я что то делаю не так, но перейдя по твоей ссылке я вижу 'compilation failed', да и моя студия говорит то же самое.

1>c:\projects\eventsystem\code\main.cpp(10): error C2440: 'initializing': cannot convert from 'std::vector<int,std::allocator<int>>' to 'std::vector<int,std::allocator<int>> &'

1>c:\projects\eventsystem\code\main.cpp(10): note: A non-const reference may only be bound to an lvalue

Иллюстрация к комментарию
раскрыть ветку (7)
0
DELETED
Автор поста оценил этот комментарий

моя собирает, стандартный проект
по ссылке выше посмотри на компилятор msvc
https://godbolt.org/g/SUg5yv

Иллюстрация к комментарию
раскрыть ветку (6)
0
Автор поста оценил этот комментарий

Да, подлая хркень.
Солветую тогда хотя бы студию обновить, судя по всему сейчас это пофикшено.

раскрыть ветку (3)
1
DELETED
Автор поста оценил этот комментарий

на студии не сижу - не нужна она мне
такое поведение отключается флагом /Za
потом на хабре есть упоминание этого факта
https://habr.com/post/322132/#sluchay-2-v-visual-studio

(на msdn не могу найти упоминаний, но проблема хорошо гуглится)

Иллюстрация к комментарию
раскрыть ветку (2)
1
Автор поста оценил этот комментарий

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

0
DELETED
Автор поста оценил этот комментарий
К сожалению, если код собирать с /Za, можно забыть про виндовые хедеры, SDK, boost с чем угодно платформозависимым (опять windows.h), Qt, и т.д. и тп. Если только компилить с этим флагом платформонезависимый код.
0
Автор поста оценил этот комментарий

вы хотябы startup banner включите канпилеру, а то непонятно какая версия то

раскрыть ветку (1)
0
DELETED
Автор поста оценил этот комментарий

1> Microsoft (R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x86

1> Copyright (C) Microsoft Corporation. All rights reserved.

1>

1> cl /c /ZI /W3 /WX- /Od /Oy- /D WIN32 /D _DEBUG /D _CONSOLE /D _UNICODE /D UNICODE /Gm /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /Fo"Debug\\" /Fd"Debug\vc140.pdb" /Gd /TP /analyze- /errorReport:prompt main.cpp

в godbolt "Microsoft (R) C/C++ Optimizing Compiler Version 19.10.25017 for x64"

0
Автор поста оценил этот комментарий

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


а вообще я всегда руководствовался мсдном и ихней спецификаций по сям, до тех пор пока не перешел на cppreference как на теоретическую базу по самому стандарту. к тому времени еще понадобился кленг, и вот тогда начало накрывать, тем что то результаты разные то еще чтонибудь. даже банально недавно отправил фидбак по вс2017, а тема такая: если билдить через саму IDE а не командной строкой, то вот стоит у линкера ключ /DEBUG  в настройках проекта, а среде пох, она всё равно вызывает линкер с ключем /DEBUG:FASTLINK, изза этого вылезают отладочные базы, которых ни виндбг ни ида ни другие не понимают.

обнаружил случайно кстати. да и на форуме тоже люди встречались мусолили этот вопрос - что за нах. вообщем разобрались что надо небольшой велосипед в виде ручной правки. а ответили банально - да это не проблема, забейте :)

вообщем.. и сама студия стала непомерно тормозной при запуске. хз. индусов наверное понабрали.


а вообще вот полезная таблица поддержки стандарта разными конпилерами

https://en.cppreference.com/w/cpp/compiler_support

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества