Рассмотрим следующий случай:
foo.h:
void foo(const std::any& v);
foo.cpp:
void foo(const std::any& v) {
std::any tmp = v;
}
main.cpp:
#include "foo.h"
int main() {
MoveOnly a;
std::any any(std::move(a));
foo(any);
return 0;
}
Внутри main.cpp
нет никакого способа узнать, будет ли foo()
делать копию v
или нет, поэтому у нас нет выбора, у есть , чтобы быть конструктором копированиядоступно на всякий случай может потребоваться его запуск.
edit: Чтобы указать что-то упомянутое в комментариях:
Ok. Так что я правильно понимаю: copy-ctor создается и static_assert запускается, потому что простой указатель указывает на copy-ctor?
По сути да. Как только указатель ссылается на функцию, эта функция должна существовать, и ее реализация вызовет генерацию кода для нее, включая оценку любого static_assert()
внутри.
Единственное, что немногов вашем понимании, указатель не существует только для этого. Это происходит потому, что существует реальная возможность, что его можно использовать для вызова указанной функции. Может быть, это будет оптимизировано во время LTO, но это слишком поздно;к тому времени генерация кода заканчивается