[英]What is the effect of & in c++ templates?
template <typename T>
const T& longestOfTheThree(const T& a, const T& b, const T& c){
T longest = a;
if (longest.length < b.length){longest = b;}
if (longest.length < c.length){longest = c;}
return longest;
}
有人可以解释为什么const T&
(特别是longestOfTheThree
之前的&
)无效吗? 为什么代码只有在我删除&
时才能编译?
此代码编译:
template <typename T>
const T longestOfTheThree(const T& a, const T& b, const T& c){
T longest = a;
if (longest.length < b.length){longest = b;}
if (longest.length < c.length){longest = c;}
return longest;
}
您正在返回对 ASDV(“堆栈”变量)的引用。 那行不通: longest
在返回之前被破坏。
如果你想返回一个引用,你可以这样做,例如:
template <typename T>
const T& longestOfTheThree(const T& a, const T& b, const T& c){
if (longest.length < b.length) { return b; }
if (longest.length < c.length) { return c; }
return a;
}
或者,如果你想保留longest
,你可以有一个指针:
template <typename T>
const T& longestOfTheThree(const T& a, const T& b, const T& c){
const T* longest = &a;
if (longest->length < b.length) { longest = &b; }
if (longest->length < c.length) { longest = &c; }
return *longest;
}
不知道为什么当有std::max
几乎可以满足您的需要时,您为什么要尝试实现自己的模板,但是如果您想隐藏longest
成员的使用,我会做类似的事情:
template<class T>
const T& longestOf(std::initializer_list<T> ilist)
{
return *std::max_element(ilist.begin(), ilist.end(), [](const T& a, const T& b) {return a.longest < b.longest;});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.