Я всегда понимал, что l-значения нужно оценивать, но по понятным и легко объяснимым причинам. Идентификатор представляет область хранения, и значение находится в этом хранилище и должно быть получено. В этом есть смысл. Но программа, нуждающаяся в оценке литерала (например, целое число 21), не имеет для меня смысла. Значение прямо здесь, насколько более явным вы можете получить? Ну, кроме добавления U для unsigned или какого-то другого суффикса. Вот почему мне любопытно, что литералы нужно оценивать, так как я видел это только в одном месте. Большинство книг также переключают терминологию, такую как «Основное выражение», «Операнд» или «Подвыражение» и тому подобное, до такой степени, что линии начинают размываться. За все это время мне еще предстоит увидеть четкое объяснение этой конкретной вещи. Кажется, это пустая трата вычислительной мощности.
Обычный литерал должен оцениваться только во время компиляции компилятором.
Пользовательский литерал может быть оценен также во время выполнения. Например, после включения <string>
заголовок, и делает его ...s
литералы, доступные по директиве using namespace std::string_literals;
, затем "Blah"s
пользовательский литерал типа std::string
, "Blah"
часть оценивается компилятором во время компиляции. Преобразование в std::string
, который включает в себя динамическое распределение, обязательно происходит во время выполнения.
Но программа нуждается в оценке литерала (например, целое число
21) не совсем имеет смысла для меня. Значение здесь, сколько
Вы можете получить более явное?
Все немного сложнее для типов с плавающей точкой. Считайте число 0.1
, В двоичном виде он не может быть представлен точно, и для него должно быть выбрано ближайшее представление с плавающей точкой. Если вы введете это число во время выполнения, преобразование 0.1
в двоичном представлении должен соблюдаться режим округления (вверх, вниз, к нулю, к бесконечности). Строгая обработка арифметики с плавающей запятой предполагает, что преобразование 0.1
Литерал с плавающей запятой для двоичного представления также должен выполняться в соответствии с режимом округления (который становится известным только во время выполнения) и поэтому не может быть выполнен компилятором (фактически большая часть этого может быть выполнена компилятором, но окончательное округление должно выполняется во время выполнения с учетом режима округления).