【发布时间】:2017-05-04 17:33:24
【问题描述】:
我使用的是 gcc 4.8.4。
以下代码失败,第 22 行出现编译器错误(已指示):
从“int* const”类型的表达式中对“int*&&”类型的引用的初始化无效
为什么不使用square 的左值版本调用square(ptr)?
#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* &)存在,因此尝试递归调用自身,因为const int*不能分配给int*&&。
标签: c++ c++11 rvalue-reference