当应用于const
被T
推导为左值引用的 时(例如,将左值传递给采用通用引用的函数时),修饰符将被忽略。假设我们传递一个常规左值int
,const T
它应该被转换为 ,const int&
但却被转换为int&
。
以下是一个例子:
#include <iostream>
template<typename T>
const T foo(T&& a)
{
// const T b{ 1 }; This would result in compile-error, cause b is just int&
const T b{ a };
return b;
}
int main()
{
int x = 5;
foo(x);
}
以下是我对C++ 的见解:
#include <iostream>
template<typename T>
const T foo(T && a)
{
const T b = {a} /* NRVO variable */;
return b;
}
/* First instantiated from: insights.cpp:13 */
#ifdef INSIGHTS_USE_TEMPLATE
template<>
int & foo<int &>(int & a)
{
int & b = {a}; // As you see I'm getting an int& here and in return type also
return b;
}
#endif
int main()
{
int x = 5;
foo(x);
return 0;
}
您可以通过应用,然后添加和引用来解决此问题std::remove_reference
,T
如下const
所示:
#include <iostream>
#include <type_traits>
template<typename T>
const std::remove_reference_t<T>& foo(T&& a)
{
const std::remove_reference_t<T>& b{ a };
const std::remove_reference_t<T>& c{ 5 }; // Can use Rvalues now
return b;
}
int main()
{
int x = 5;
foo(x);
}
我只是想知道这种行为是否有某种解释?这种行为还可能在哪里发生?如果我遗漏了什么,我将非常感激您的评论。
用东方
const
术语来思考会有所帮助。限定词如const
关联到左边,除非左边什么也没有 - 但const T
和T const
实际上意思相同。const
适用于从右侧(东侧)看整体。T
当
T
变成int&
时,这毫无意义const T
,int& const
因为引用无论如何都是不可变的。如果是指针,那就更清楚了。如果
T
是,则int*
变为,这是一个不可变指针,但它指向的对象不是,并且可以改变:const T
T const
int* const
const