我一直认为接受通用引用的以下函数必须返回一个const-reference.
template <typename T>
const T& Const(T&& val)
{
return val;
}
Run Code Online (Sandbox Code Playgroud)
但是,以下代码使用VS C++和gcc成功编译:
int x = 5;
Const(x) = 6;
Run Code Online (Sandbox Code Playgroud)
运行后变量x的值等于6.因此,Const函数返回非const引用.
要获得编译器错误,必须修改函数Const以接受传统的l值引用或声明为返回const std::remove_reference_t<T>&.
这是为什么?我错过了什么规则?提前致谢!
您能告诉我,使用 auto&& 作为函数返回值总是比使用 auto 更好的选择吗?例如,在
auto val = someObj.getVal();
Run Code Online (Sandbox Code Playgroud)
如果 getVal() 返回引用,则 val 将是一个副本。但是,使用通用引用auto&&就没有这样的缺点吗?我需要知道的唯一信息是 getVal() 是否为 const。