К каким терминам мы можем применить лемму?

При компиляции шаблоны должны быть созданы экземплярами , прежде чем их компилировать в объектный код. Это создание может быть достигнуто только в том случае, если известны аргументы шаблона. Теперь представьте сценарий, в котором функция шаблона объявлена ​​в a.h, определенная в a.cpp и используемая в b.cpp. Когда компилируется a.cpp, не обязательно известно, что для предстоящей компиляции b.cpp потребуется экземпляр шаблона, не говоря уже о том, какой конкретный экземпляр это будет.

Можно утверждать, что компиляторы можно сделать умнее, чтобы «смотреть вперед» для всех применений шаблона, но я уверен, что это было бы нелегко создавать рекурсивные или другие сложные сценарии. AFAIK, компиляторы этого не делают. Как заметил Антон, некоторые компиляторы поддерживают явные декларации экспорта экземпляров шаблонов, но не все компиляторы поддерживают его (пока?).

0
задан Abby 3 March 2019 в 17:08
поделиться

1 ответ

Оператор + в Coq является ассоциативным слева, поэтому такие термины, как a + b + c + d, фактически скрыты в ((a + b) + c) + d. Это должно ответить, почему plus_comm не делает то, что вы ожидаете.

Чтобы решить эти типы целей, вам нужно применить ряд лемм, как вы узнали. Это часто может быть утомительным, поэтому есть некоторые тактики для их решения, такие как omega (см. этот вопрос).

0
ответ дан user138737 3 March 2019 в 17:08
поделиться