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

What is the effect of & in c++ templates?

提问人:quant 提问时间:12/23/2022 最后编辑:Remy Lebeauquant 更新时间:12/23/2022 访问量:83

问:

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; 
}
C++ 模板 常量 按引用传递

评论

6赞 tkausl 12/23/2022
出于同样的原因,它在非模板函数中无效:您不应返回对局部变量的引用。
1赞 Peter 12/23/2022
其含义与非模板代码中的含义相同 - 在示例中,该函数通过引用接受三个参数,并返回一个引用。该代码在返回时无效,因为是一个局部变量,具有自动存储持续时间,因此当函数返回时将不复存在。返回对不再存在的事物的引用将导致(如果允许)未定义的行为(因为,如果调用方使用该引用,它将访问不再存在的变量)。constconstlongest
0赞 M.M 12/23/2022
@tkausl通常这不会导致编译错误(尽管 OP 可能已经将编译器配置为报告错误——可能不是一个坏主意!
0赞 M.M 12/23/2022
在询问有关代码为什么不编译的问题(以及重现编译错误所需的最少代码)时,请包含编译器错误消息

答:

0赞 lorro 12/23/2022 #1

您正在返回对 ASDV(“堆栈”变量)的引用。那行不通:在返回之前被销毁。longest

如果要返回引用,可以执行以下操作:

template <typename T>
const T& longestOfTheThree(const T& a, const T& b, const T& c){
    if (a.length < b.length) {
        if (b.length < c.length) { return c; }
        return b;
    } else /* !(a.length < b.length) */ {
        if (a.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;
}

评论

1赞 UKMonkey 12/23/2022
你的第一个例子并没有真正起作用。“最长”不是第一定义的,第二是“a”永远不会被比较(第三,如果 c > b >最长,它只会返回 b,而不是 c)
0赞 lorro 12/23/2022
@UKMonkey 确实,固定了,谢谢。
0赞 HolyBlackCat 12/23/2022
代表什么?ASDV
0赞 lorro 12/23/2022
@HolyBlackCat 自动存储持续时间变量。许多人将它们称为“堆栈”变量,但堆栈不是标准的一部分。
0赞 HolyBlackCat 12/23/2022
嗯,以前从未见过这个缩写。