UB в этом контексте легче отследить, поскольку в этом контексте существует ограниченный набор операций. Тем не менее, иногда компиляторы не ловят вещи , и в этом случае он не ловит это, давайте пройдемся. Очевидно, что в идеальном мире компиляторы будут ловить все, иногда они.
Так что же делают компиляторы, когда они не могут решить, является ли программа UB или нет? Они все еще принимают программу и продолжают компилировать со скрещенными пальцами? Или они более консервативны и отвергают программу, даже если она потенциально верна?
Если они не улавливают UB в программе, они просто компилируют ее. Это связано с тем, что при неопределенном поведении не нужно заботиться о том, что происходит . Поэтому, если у него нет конкретного случая, подобного этому, где ему нужно искать неопределенное поведение, он может предположить, что неопределенного поведения не существует, и все равно его скомпилировать. И в случае, подобном этому, где он должен искать UB, но не ловит его, он, вероятно, все равно его компилирует. Почему бы и нет?
Более фундаментально, почему стандарт запрашивает без UB?
Во-первых, он не запрашивается;требуется, чтобы в вашей программе не было UB!
Однако, если вы говорите о том, почему UB вообще существует в стандарте, видео, на которое вы ссылались, объясняет это гораздо лучше, чем я. Короче говоря, существуют технические причины наличия UB.
Если вы спрашиваете, почему он указывает компиляторам выдавать предупреждение / выдавать ошибку, если он находит UB в constexpr, я предполагаю, что он пытается сохранитьВы от себя.
Я думаю, что это несовместимо с остальной частью C ++, которая никогда не мешает вам выстрелить себе в ногу. Я бы предпочел, чтобы GCC принимал мой код constexpr и вылетал, или генерировал мусор, если UB;вместо того, чтобы не компилировать, когда он не знает, является ли это UB.
Полагаю, удержание вас от причинения себе вреда - это не то, что семья C делает много, но мы должны быть благодарны за это.
Поскольку GCC принимает ваш constexpr
и выходит из строя позже, вы уверены, что это то, что вы хотите? Для одного, который побеждает цель constexpr
, а для другого, предположим, что плохой constexpr
превращен в рабочий код. Тогда это будет сбой для пользователей / клиентов. Теоретически, не лучше ли поймать это во время компиляции?
Наконец:
Для меня это имеет практическое значение
Если это так, то я предлагаю либо создать еще один вопрос на этом практическом примере, либо отредактировать этот вопрос на таком примере, так как действительно трудно ответить, что лучше для вашего случая без него.