template<typename T>
void F(T&& x) {}如果我们用整数类型的参数来调用它&一切都是明确的--引用就会发生崩溃,而且我们仍然有lvalue-引用。但是,如果我们用int参数来调用它,会发生什么。我的想法是:我们已经推导了T=int类型,用rvalue-引用来修饰它,所以F采用整&参数,用int类型调用它会导致错误。但在实数F中,这类论点被认为是一种参考。参考价值从何而来?编译器应用了什么规则来获得int& from int?
发布于 2017-12-09 10:07:16
自C++17以来,C++标准中就有转发引用的概念。Normaly将模板参数推导为非参考参数。但是对于转发引用的具体情况,如果相应的参数是一个lvalue,则该参数被推导为一个引用。C++标准(N4700)[temp.over.deduct.call]/3
...A转发引用是对不表示类模板的模板参数(在类模板参数推导(over.match.class.deduct)期间)的不限定模板参数的rvalue引用。如果P是一个转发引用,而该参数是一个lvalue,则类型“lvalue引用到A”代替A作为类型演绎.
对于函数调用的关注,它的含义与C++11(N337)和C++14(N414) tem.over.duct.Call/3中的等效段落相同:
...If P是对cv-非限定模板参数的rvalue引用,参数是lvalue,类型“lvalue引用A”代替A用于类型演绎.
发布于 2017-12-09 09:23:55
转发引用导出lvalue的lvalue引用和rvalue的rvalue引用。例如,即使对于 lvalue (类型为int&& ),它仍将推导出int& (与int类型的值一样),同样,对于int或int&&类型的lvalue,它也将推导出int&&
template<typename T>
class show;
template<typename T>
void F(T&& x)
{ show<decltype(x)>();}
int main() {
int&& x = 5;
F(x);
}main.cpp:6:3: error:未定义模板“show”的隐式实例化
int main() {
F(5);
}main.cpp:6:3: error:未定义模板“show”的隐式实例化
int main() {
int x = 5;
F(x);
}main.cpp:6:3: error:未定义模板“show”的隐式实例化
int main() {
F([]()->int{return 5;}());
}main.cpp:6:3: error:未定义模板“show”的隐式实例化
https://stackoverflow.com/questions/47726959
复制相似问题