Задать вопрос
  • Почему может быть ошибка во время компиляции?

    @MarkusD Куратор тега C++
    impelix, тебе ведь не описать эту строку предложили, а сделать этот код более понятным. Сейчас код в этой строке вызывает вопросы.
    Оператор присвоения возвращает результат присвоения. Это то поведение, которого ты ожидаешь от кода? Оно не всегда является очевидным.
    Почему бы не переписать эту строку так?
    parent[num] = findMN(parent[num]);
    return parent[num];

    И не стоит опасаться за двойную индексацию. Оптимизатор C++ такие места видит лучше тебя и оптимизирует полностью самостоятельно. Особенно-то при том, что изначально ты итак все сделал через двойную индексацию.
  • Является ли такой способ выделения массива объектов на хипе идиоматичным?

    @MarkusD Куратор тега C++
    floppa322,
    А разве в случае prvalue трейты std::remove_reference+std::remove_const не сделают ничего ?

    Об этом я и написал. Они ничего и не сделают. Даже не отмаркируют фактическое нарушение контракта (нужна константность, нужна ссылка). Т.е. может быть сейчас они и сделают что-то что тебе нужно, но так будет не всегда, за то они всегда будут позволять трансляцию дальше. В этом плане std::decay даже понятнее, т.к. его семантика говорит снять все что есть. А если ничего нет, то и снимать нечего. Тут нужно видеть разницу между "снять все что есть" и "снять именно это".

    std::decay удобен своей семантикой. Читаешь и сразу понимаешь что происходит с переданным типом.
    Связку из двух-трех трейтов в одной строке читать уже сложнее. Пусть эта связка и является прямой заменой std::decay. Преобразование к указателю - незначительное зло, с которым даже можно успешно жить.
    На деле мне ни разу не пришлось пересекать тип массива статической длины и std::decay, они всегда идут разными путями.
  • Является ли такой способ выделения массива объектов на хипе идиоматичным?

    @MarkusD Куратор тега C++
    floppa322, пагубное есть. Через такие конструкции ты выражаешь определенные ожидания от пользователя твоего шаблона. Даже если пользователь - ты сам.
    Через подобные объявления ты создаешь контакт. Но кто следит за его выполнением? Тут ведь нет ни одного ограничения. В иной ситуации тебе в test первым параметром зайдет внезапно prvalue, для которого T выведется в чистый тип. Трансляция даже не остановится, т.к. std::remove_reference и std::remove_const созданы так, чтобы не замечать отсутствия того, что они призваны удалять.
    И в какой-то неожиданной ситуации это все, в конечном итоге, однажды рухнет.

    Честно, проще взять второй шаблонный параметр, а в теле функции уже сделать static_assert на соответствие типов. И в этом месте яб именно std::decay использовал. Так твой контракт получит механизм соблюдения.
    В C++20 так и вовсе можно использовать requires для явного определения контракта.
  • Является ли такой способ выделения массива объектов на хипе идиоматичным?

    @MarkusD Куратор тега C++
    floppa322, сейчас ты описал Object Pool. Это другое.
    Memory Pool полноценно создает и уничтожает объекты, контролируя только выделенную под них память в своих страницах. Именно пулы памяти используются для дешевого выделения больших количеств объектов с полиморфизмом. Очень часто пул памяти выступает источником памяти для абстрактной фабрики.
    При этом для пула памяти характерно именно то, что в ячейку странички по выравниванию и размеру входит объект любого типа из полиморфной иерархии. Т.е. все как ты и описал в своем вопросе.
  • Является ли такой способ выделения массива объектов на хипе идиоматичным?

    @MarkusD Куратор тега C++
    floppa322, UE не показатель хорошего кода. Совсем не показатель. Даже наоборот, хоть в целом инструмент и пользуется популярностью, в деталях же он кишит совершенно неподходящими к месту решениями.
    Они там очень часто пишут шиворот-навыворот, буквально не оставляя никакой возможности заимствовать их код как есть.

    Принято же у людей разное. В разных сословиях разные порядки. Гулять между сословиями можно вполне свободно, просто придерживаясь тех или иных порядков.
    У некоторых людей принято обосновывать свои решения и прибегать к знанию архитектуры ПО на всех уровнях разработки. У некоторых людей принято лабать на сишечке даже в плюсах, без особых рассуждений о будущем написанного кода. Кое-кто вообще ежедневно и во всеуслышание твердит, что "говнокод захватит этот мир", попутно и со всем усердием делая свой посильный вклад в процесс этого захвата.
    Просто выбери свою сторону. Я вот выбрал знание и следование стандарту, знание архитектуры и выбор инструментов через обоснование. Не все люди одобряют мой выбор. И так будет всегда, что бы ты ни выбрал.
  • Является ли такой способ выделения массива объектов на хипе идиоматичным?

    @MarkusD Куратор тега C++
    floppa322, грубо говоря, в первом случае ты изобрел Memory Pool. Не Object Pool, т.к. объекты у тебя начинают и завершают время своей жизни, а выделенная под них память является сырой.

    К тебе вопрос. Что такое "боле идиоматичный" способ?
    Первый пример у тебя почти-почти реализует шаблон проектирования. В это время второй пример у тебя демонстрирует решение бытовой потребности в "стиле сишечки". Там у тебя не ** должен быть, а std::vector на должный умный указатель.
    В этом контексте мне не понятно, о чем именно ты спрашиваешь. Ясность должно внести толкование используемого тобой термина.
  • Как преобразовывать тип данных?

    @MarkusD Куратор тега C++
    War4 , тебе следует переместить код в тело вопроса (П5.7 регламента) и оформить его по правилам (П3.8 регламента).
    Опиши в теле вопроса проблему так, чтобы ее можно было понять (П3.2 регламента).
  • Не получается вернуть строку. Как исправить?

    @MarkusD Куратор тега C++
    Сергей Мокин , П3.8 регламента работы сервиса.
    Тебе следует оформить код как следует. Выдачу ошибок стоит взять из лога сборки и тоже оформить правильно.
  • Как отдать строку?

    @MarkusD Куратор тега C++
    Сергей Мокин , П3.8 регламента работы сервиса.
    Тебе следует оформить код как следует.
  • Почему MSVC выдает ошибку что размер массива должен быть константным выражением, а Clang/GCC компилирует без ошибок?

    @MarkusD Куратор тега C++
    colorname, чтобы дать тебе объяснение, от тебя требуются настройки трансляции для clang и GCC.
    При этом учитывать стоит то, что GCC действительно позволяет VLA в C++, что нарушает стандарт. Поэтому в GCC у тебя просто не будет этой ошибки.
  • Почему MSVC выдает ошибку что размер массива должен быть константным выражением, а Clang/GCC компилирует без ошибок?

    @MarkusD Куратор тега C++
    colorname , ты зря поставил лайк на другой ответ. Он не соответствует действительности.
    А этот ответ является и правильным, и вопрос твой тоже решает.
    Выражение int value = 12; должно иметь характеристику времени компиляции. В ином случае контекстом вызова scale в выражении scale(value) будет контекст времени исполнения, а не контекст времени компиляции.
  • Почему VS22 указывает что функция якобы не определена?

    colorname,
    И кто решил что это именно сбой?

    Я знаю стандарт C++ и я вижу что здесь именно сбой студии потому что студия должна корректно отображать все, что написано в рамках стандарта. А у тебя вариантов много, собственно, от незнания.
    Задавая подобные вопросы, ты должен понимать что задаешь их человеку, который пишет отчеты об ошибках в трансляторах C++ и разработчики трансляторов эти ошибки исправляют.

    Ты задал свой вопрос здесь и тебя перенаправили к разработчикам продукта. В чем проблема? Твой дальнейший порядок действий - это найти или создать у разработчиков этот вопрос, а ссылку на него прикрепить здесь в качестве решения этого вопроса. Подобные вопросы они решают довольно быстро.
  • Почему VS22 указывает что функция якобы не определена?

    colorname,
    Какая то проблема именно в написании -> int(*)[10]

    У нас в правилах есть П5.17, запрещающий обсуждать сбои в работе электронных ресурсов.
    В это же время, П2.3 обязывает тебя перед написанием вопроса убедиться что твой вопрос не адресован какой-либо конкретной организации.
    Публикация вопросов, компетентно ответить на которые могут только представители конкретной организации, неизбежно приводит к провокации нарушений п. 3.4, 5.14 - 5.17 правил данного Сервиса.


    На твой вопрос квалифицированно смогут ответить только в техподдержке студии. Ну и, возможно, там уже даже заведен вопрос на твою тему.
    Дело в том, что у тебя конкретно ситуация сбоя в работе студии. Вопросы по настройке и использованию студии допустимы в тегах Q&A. А вот вопросы по сбоям - нет.
  • Как построчно выводить даные из .txt документа в C++?

    @MarkusD Куратор тега C++
    CteplerMarinovich
    У меня есть метод

    Это не метод.

    должен возвращать текст из файла построчно

    А ты можешь словами описать то, что делает этот код?

    return 0;
    Как ты думаешь, почему эта строчка не вызывает ошибки трансляции?

    break;
    return res;

    Как ты думаешь, выполнится ли вторая строчка в этом коде?
  • Как правильно сделать условие для прохождения символом по спирали в матрице?

    @MarkusD Куратор тега C++
    Sergo Zar , свой код ты написал на базе анализа задания.
    Изложи свой анализ задания. Твой код сейчас не интересен.
  • Почему в декларации шаблонных параметров могут быть разные идентификаторы типов?

    @MarkusD Куратор тега C++
    Qubc , а почему в коде существуют разные имена переменных и функций?
    Я вот серьезно. Почему бы не ограничить имена переменных ровно одной строчной буквой? Почему бы не ограничить имена функций ровно одной заглавной буквой?
  • Как это можно реализовать?

    @MarkusD Куратор тега C++
    iihaarr , так. Вот сейчас я попрошу минуточку, буквально, твоего внимания.
    Объясняя вопрос, ты должен объяснять именно вопрос, а не свой способ решения вопроса, приведший тебя в тупик.

    Откатись в своих рассуждениях назад и измени свой вопрос так, чтобы он объяснял: какую конкретную задачу ты начал решать через применение полиморфизма и идиомы состояния. Мне кажется, сама твоя задача интереснее чем имеющаяся сейчас попытка решения этой задачи.
  • Почему запускается деструктор в данном примере?

    @MarkusD Куратор тега C++
    krot0glot, про стандарты. Да. Труд комитета стандартизации C++ не бесплатен. Это вообще очень дорогое удовольствие - заниматься стандартизацией работы сложного инструмента. И я бы рекомендовал именно купить стандарт. Стоит он не так много в обмен на изложенную в нем информацию.
    Но! Есть одно маленькое но. Рабочие копии стандарта являются открытыми в виду специфики работы самого комитета. Все рабочие копии протоколируются и сохраняются в историю. И именно из этой истории публикуются стандарты на продажу. В этой истории можно найти документ почти похожий на финальный стандарт C++11, C++14, C++17 и C++20. Сходство неточное, но пользоваться им можно с т.з. пользователя языка.

    Ну а самым приближенным руководством является именно документация языка, которую ведет один из заседателей комитета.

    Приведенный мной участок кода - это только один из сильно бросающихся в глаза. Попробуй глазами прочитать код для случая, когда в MyString::Copy передан ноль. Где именно произойдет падение и почему?
    Нужно ли тебе писать m_string[m_length] = '\0'; или m_string можно как-то иначе инициализировать чтобы не писать эту строчку?
    В MyString::Copy ты практикуешь ранний выход, но не нарушает ли это инвариант типа?
    Ну и под конец, каким должен быть тип результата чтобы при выходе из MyString::Copy из *this не создавалась временная строка, деструктор которой ты и наблюдаешь?
  • Почему запускается деструктор в данном примере?

    @MarkusD Куратор тега C++
    RabraBabr, я ожидал этот ответ в более развернутой форме от автора вопроса. Но, в целом, да.
    rPman, чтобы понять поведение new, нужно читать именно стандарт, а не документацию майков.
    new не убивает процесс. Рядовая форма, используемая в этом коде, именно что бросит исключение, ловить которое будет некому. Ситуацию в сторону возвращается ноль исправляет аргумент std::nothrow для самого new.