警告C4172返回本地变量或临时地址。但是我返回一个输入参数值

时间:2018-08-17 02:51:59

标签: c++ templates

我设计了一个模板类,它可以操作多种字符串,例如CString和std :: string。我已经使用了很长时间,而且效果很好。但是“ at”函数中的“ return str [i]”导致警告C4172,这意味着我返回了本地变量的地址。但是str不是局部变量。它应该从外面传递。 如何使编译器不提示警告?

template<class TSTR, typename TCHR>
    class stringOpr
    {
    public:
        typedef typename TSTR TSTRING;
        typedef typename TCHR TCHARTYPE;
        virtual const TCHARTYPE& at(const TSTRING& str, int i) const
        {
            return str[i];//Warning C4172
        }
...
};

enter image description here

1 个答案:

答案 0 :(得分:1)

该警告是有道理的。 如果存在MyString,则其运算符未返回引用。

class MyString
{
char operator[](int i) const;
};

此功能将崩溃。 在这种情况下,您应该重写“ at”函数以适合返回的引用。 如果您确实要返回参考,请执行此操作,

#pragma warning(disable : 4172)    
virtual const TCHARTYPE& at(const TSTRING& str, int i) const
{
    return str[i];
#pragma warning(default : 4172)
}

忽略警告,然后在此之后重新启用它。

/ ------------------------------------------- --------- /

CString :: operator []确实不返回引用。所以我让步

virtual /*const*/ TCHARTYPE/*&*/ at(const TSTRING& str, int i) const
        {
            return str[i];
        }