В обоих кодовых блоках есть некоторая перегрузка оператора.
В первом блоке кода строка MatrixXd m(2,2);
- это , создающая объект , так как это объявление, и у нас есть тип MatrixXd
. Следовательно, синтаксис m(i, j)
должен быть вызовом конструктора, получающего два параметра (он также может быть конструктором, получающим больше параметров, если другие параметры имеют значения по умолчанию).
Другие строки в первом блоке кода не вызывают конструктор, и поэтому синтаксис m(i, j)
означает вызов реализации operator()(i, j)
. Технически, что-то похожее на operator()(int i, int j)
. Таким образом, первый блок кода нуждается только в одной перегрузке оператора, и его часто используют один человек.
Второй блок кода мне кажется больше волшебным. Часть m << Number
означает, что тип m
, который является Matrix3f
, имеет перегрузку для operator<<
. Тогда я думаю, что тип того, что operator<<
возвращает 1 , должен иметь реализацию оператора запятой, чтобы разрешить часть 1, 2, 3, ...
. Оператор запятой используется редко, и это самый непонятный оператор для перегрузки IMHO. Таким образом, второй блок кода требует двух перегрузок операторов, и одна из них является более неясной. Да, это волшебство.
1 Это может быть ссылка на m
и, следовательно, Matrix3f
или даже совершенно другой тип, созданный авторами Eigen дляразрешить этот хороший синтаксис для инициализации матрицы.