А разве в случае prvalue трейты std::remove_reference+std::remove_const не сделают ничего ?
std::decay
даже понятнее, т.к. его семантика говорит снять все что есть. А если ничего нет, то и снимать нечего. Тут нужно видеть разницу между "снять все что есть" и "снять именно это".std::decay
удобен своей семантикой. Читаешь и сразу понимаешь что происходит с переданным типом.std::decay
. Преобразование к указателю - незначительное зло, с которым даже можно успешно жить.std::decay
, они всегда идут разными путями. test
первым параметром зайдет внезапно prvalue, для которого T
выведется в чистый тип. Трансляция даже не остановится, т.к. std::remove_reference
и std::remove_const
созданы так, чтобы не замечать отсутствия того, что они призваны удалять.static_assert
на соответствие типов. И в этом месте яб именно std::decay
использовал. Так твой контракт получит механизм соблюдения.requires
для явного определения контракта. int value = 12;
должно иметь характеристику времени компиляции. В ином случае контекстом вызова scale
в выражении scale(value)
будет контекст времени исполнения, а не контекст времени компиляции. И кто решил что это именно сбой?
Какая то проблема именно в написании -> int(*)[10]
Публикация вопросов, компетентно ответить на которые могут только представители конкретной организации, неизбежно приводит к провокации нарушений п. 3.4, 5.14 - 5.17 правил данного Сервиса.
У меня есть метод
должен возвращать текст из файла построчно
return 0;
break;
return res;
MyString::Copy
передан ноль. Где именно произойдет падение и почему?m_string[m_length] = '\0';
или m_string
можно как-то иначе инициализировать чтобы не писать эту строчку?MyString::Copy
ты практикуешь ранний выход, но не нарушает ли это инвариант типа?MyString::Copy
из *this
не создавалась временная строка, деструктор которой ты и наблюдаешь? new
, нужно читать именно стандарт, а не документацию майков.new
не убивает процесс. Рядовая форма, используемая в этом коде, именно что бросит исключение, ловить которое будет некому. Ситуацию в сторону возвращается ноль исправляет аргумент std::nothrow
для самого new
.
Оператор присвоения возвращает результат присвоения. Это то поведение, которого ты ожидаешь от кода? Оно не всегда является очевидным.
Почему бы не переписать эту строку так?
И не стоит опасаться за двойную индексацию. Оптимизатор C++ такие места видит лучше тебя и оптимизирует полностью самостоятельно. Особенно-то при том, что изначально ты итак все сделал через двойную индексацию.