c++ - 警告 C4172 返回局部变量或临时变量的地址。但我返回一个输入参数值

标签 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

最佳答案

这个警告是有道理的。 如果有一个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];
        }

关于c++ - 警告 C4172 返回局部变量或临时变量的地址。但我返回一个输入参数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51887760/

相关文章:

c++ - 使用函数使 SFINAE 正确

c++ - 自己的字符串用法

c++ - 具有数组或 vector 参数的类模板

c++ - 在QMessageBox中,如何添加到Ctrl-C复制的文本中?

第三方库和同名类的 C++ 命名空间问题

c++ - 根据外部类模板参数的嵌套类特化

c++ - 如何从父模板函数访问子成员?

html - XSLT 作为从 ant 运行的多个文件上的简单 HTML 模板引擎

c++ - 计算光栅化片段的数量

c++ - QDomNode 到 html