うーん、const参照でオブジェクト返しても、shallow copyするやつだと受け取り側が非constで受け取るとオブジェクトの中身書き換えられちゃうか
— wata_d (@wata_d) 2022年2月15日
void draw_circle(const cv::Mat& mat) { cv::Mat copy = mat; cv::circle(copy, { 50, 50 }, 50, 255, -1); // なんならこれも通る // cv::circle(mat, { 50, 50 }, 50, 255, -1); } cv::Mat1b mat = cv::Mat1b::zeros(100, 100); draw_circle(mat); // ここで、matの内容が書き換えられている
という感じでconst参照で渡しても中身書き換えられちゃうのなんかイヤだなーと。渡すときにcloneすればいいんですが書き換えない場合は無駄になるので避けたいじゃないですか。constなんだから変わらないだろうと思ったら、関数の中でうっかり書き換えちゃってたりすると悲しいことになったり…。
コピーコンストラクタでコピー元が非constの時だけshallow copyする、というわけにもいかないんですかね。何かハマり所はありそう。