Лямбда без захвата не должна иметь никаких подобъектов;это просто тип с перегрузкой operator()
. Таким образом, это может быть (но не обязательно) пустой тип. unqiue_ptr
разрешено (но не обязательно) оптимизировать способ, которым он "содержит" тип средства удаления, так что, если тип средства удаления является пустым типом класса, он может использовать различные методы, чтобы гарантировать, что этот тип не занимаетхранилище внутри самого экземпляра unique_ptr
.
Есть несколько способов сделать это. unique_ptr
может наследоваться от типа, полагаясь на EBO для оптимизации базового класса. С C ++ 20 он может просто сделать его подобъектом члена, полагаясь на атрибут [[no_unique_address]]
для обеспечения оптимизации пустого члена. В любом случае единственное фактическое хранилище, в котором нуждается unique_ptr<T>
, это указатель на T
.
В отличие от этого, указатель на функцию - это указатель на функцию. Это фундаментальный тип, который должен иметь хранилище, потому что он может указывать на любую функцию с этой сигнатурой. Тип по существу содержит функцию-член для вызова как часть самого типа;указатель на функцию не делает. Экземпляр типа на самом деле не нуждается в хранилище, чтобы найти его operator()
.