В C 11 введение constexpr в качестве квалификатора типа для функций подняло вопросы о его связи с существующим механизмом inline для встраивания функций. В этой статье рассматриваются возможности constexpr и то, как он взаимодействует со встроенными.
Стандарт C 11 явно гласит, что «функции constexpr и конструкторы constexpr являются неявно встроенными». Это означает, что использование constexpr в качестве спецификатора функции также неявно устанавливает встроенный спецификатор. Следовательно, если функция объявлена constexpr, она будет вести себя так, как если бы она имела встроенный спецификатор.
Это означает, что если в как функцию constexpr, компилятор все равно попытается встроить функцию, как если бы она была объявлена встроенной. Это связано с тем, что функции constexpr должны соответствовать определенным критериям, которые делают их пригодными для встраивания, например, быть простыми и нерекурсивными.
Однако важно отметить, что встроенные функции Спецификатор оказывает более существенное влияние на правило одного определения (ODR), чем на само встраивание. Функции с разными встроенными квалификаторами могут иметь несколько определений, в то время как функции constexpr, как и встроенные функции, должны иметь одно определение.
Хотя функции constexpr неявно подразумевают встроенные функции, спецификатор inline имеет ограниченное влияние по встраиванию решений. В конечном итоге компилятор определяет, следует ли встраивать функцию, на основе различных факторов, включая ее размер и сложность. Функции Constexpr изначально были разработаны для встраивания, но последующие послабления позволили создавать более сложные функции constexpr.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3