- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
#include <iostream>
using namespace std;
namespace mine {
template <typename T>
struct remove_rval {
using type = T;
};
template <typename T>
struct remove_rval<T&&> {
using type = T;
};
template <typename T>
void g(const T& = typename remove_rval<T>::type())
cout << __PRETTY_FUNCTION__ << endl;
}
}
int main()
{
mine::g<int&&>(); // doesn't work, because of explicit template?
const int& i2 = mine::remove_rval<int&&>::type(); // works, sanity check
return 0;
}
我写的函数模板无法编译。根据我对 C++ 的理解,您可以将右值分配给常量左值引用。但是,在这种情况下,就像推导类型在分配函数默认值时忽略“const”限定符一样。这是为什么?
最佳答案
来自dcl.ref/p6 :
If a typedef-name ([dcl.typedef], [temp.param]) or a decltype-specifier ([dcl.type.decltype]) denotes a type TR that is a reference to a type T, an attempt to create the type lvalue reference to cv
TR
creates the type lvalue reference toT
, while an attempt to create the type rvalue reference to cv TR creates the typeTR
.
因此,在您的示例中,当 T = int&&
: const T&
折叠为T&
(即 int&
)并且不是 const T&
(即 const int&
)根据上面引用的声明。因为我们无法绑定(bind)像 remove_rval<T>::type()
这样的右值对于非常量左值引用,您会收到上述错误。
因此,即使 g
中函数参数的形式是对 const T
的引用 又名 const 左值引用(即 const T&
),第一次调用 g
实例化 g
引用非常量 T
又名非常量左值引用(即 T&
= int&
)作为参数:
template<>
void g<int &&>(int&)
{
//operator<< called here
}
由于参数是int&
,我们不能绑定(bind)像 remove_rval<int&&>::type()
这样的右值到该参数。
关于C++ 模板显式右值类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71240646/
我是一名优秀的程序员,十分优秀!