繁体   English   中英

&在c ++模板中的作用是什么?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM