例如:
template <typename T> void g(T &&val);
int i = 0; const int ci = i;
g(i = ci);
Run Code Online (Sandbox Code Playgroud)
什么是模板参数g?
根据§5.18/ 1:
赋值运算符(=)和复合赋值运算符都是从右到左分组.所有都需要一个可修改的左值作为左操作数,并返回一个左值操作数的左值.[...]
所以,在
g(i = ci)
Run Code Online (Sandbox Code Playgroud)
i返回左操作数,因此T推导出int&.
您可以通过以下代码段进行检查:
#include <type_traits>
template <typename T>
void g(T &&val) {
static_assert(std::is_same<T, int&>::value, "Nope");
}
int main() {
int i = 0; const int ci = i;
g(i = ci);
}
Run Code Online (Sandbox Code Playgroud)