私はgcc 4.8.4を使用しています。ポインターのrvalue/const値のオーバーロード
次のコードは、ライン22(示される)から、コンパイラエラーで失敗する:タイプの表現からタイプ 'INT * & &' の基準の
無効初期化 'INT * CONST'
square(ptr)
への呼び出しが、左辺バージョンsquare
を使用していないのはなぜですか?
#include <iostream>
#include <memory>
int square(int* &&num) {
std::cout << "rvalue" << std::endl;
std::unique_ptr<int> x(num);
const auto ptr = x.get();
return square(ptr); // this is line 22
}
int square(const int* &num) {
std::cout << "lvalue" << std::endl;
return (*num) * (*num);
}
int main() {
std::unique_ptr<int> up(new int);
*up = 5;
std::cout << square(up.release()) << std::endl;
}
'square(const int *&)'は 'square(int * &&)'の前に前方宣言されていますか?そうでなければ 'square(int * &&)'は 'square(const int *&)'が存在することを知らず、代わりに再帰的に自身を呼び出そうとします。 'int * &&'に代入されます。 –