Сегодня я написал выражение:
"<" + message_id + "@" + + ">"
и удивился, что это на самом деле скомпилировано (PS message_id
является QString, он также будет работать с std :: string)
Я часто делаю подобные вещи, пропускаю переменную во время работы и ожидаю, что компилятор скажет мне, где я до сих пор пропускаю записи. Финал будет выглядеть примерно так:
"<" + message_id + "@" + network_domain + ">"
Теперь я хотел бы знать, почему унарный оператор + действителен для строкового литерала !?
Одинарный +
может применяться к значениям арифметического типа, значениям перечисления с незаданной областью и значениям указателя, потому что …
Стандарт C ++ определяет это таким образом, в C ++ 11 §5.3.1 / 7.
В этом случае строковый литерал, который имеет тип массива char const
распадается на указатель на char const
,
Всегда полезно смотреть документацию, когда кто-то задумывается о функциональности чего-либо.
«Операнд унарного +
оператор должен иметь арифметическое, перечисление с незаданной областью или тип указателя и
Результатом является значение аргумента. Интегральное продвижение выполняется для целочисленных или перечислимых операндов.
Тип результата — это тип повышенного операнда ».
Других решений пока нет …