Ответ 1
Слайд странный и вводящий в заблуждение. SWIG не преобразует значение pass-by-value в pass-by-reference вообще. Позвольте мне пояснить на примере:
Скажем, что, как в примере, у вас есть функция С++
double dot_product(Vector a, Vector b);
Теперь на простом С++ (без SWIG, без упаковки) вы можете использовать эту функцию, как в следующих примерах:
1.
Vector a = Vector(1,0);
Vector b = Vector(0,1);
double zero = dot_product(a, b);
2.
Vector *a = new Vector(1,0);
Vector *b = new Vector(0,1);
double zero = dot_product(*a, *b);
В обоих случаях функция фактически вызывается точно так же, используя значение по умолчанию.
SWIG обертывает все объекты в структуру, содержащую указатель на объект, поэтому под капотом SWIG передает указатели вокруг всего и поэтому использует синтаксис, как во втором примере. Но преобразование/преобразование семантики вызова не происходит.
Чтобы ответить на ваши вопросы:
"Кажется, отлично работает с С++, если вы не слишком умны". Что значит быть слишком умным?
Я понятия не имею. Как сказано в другом ответе, вероятно, шутка.
Известна ли ситуация/случай, что я shuold очень осторожен, когда я программирую модули на С++ и расширяю Python с помощью инструмента swig?
Это очень широкий вопрос, и, безусловно, есть подводные камни, особенно связанные с управлением памятью. Однако это конкретное "преобразование" не является проблемой.
Для справки, здесь соответствующая запись в руководстве SWIG. Обратите внимание, что он сформулирован по-разному: функция преобразуется для принятия указателей. Ничего не сказано о "семантике вызова" (поскольку это не проблема).