c++ - 为什么将 shared_ptr<T> 作为 shared_ptr<const T> 返回会导致 "returning address of temporary"警告?

标签 c++ visual-studio

class Example
{
    boost::shared_ptr<FilterProvider> filterProvider;
public:
    void RegisterFilter(const boost::shared_ptr<FilterProvider>& toRegister)
    {
        filterProvider = toRegister;
    }
    const boost::shared_ptr<const FilterProvider>& GetFilter() const
    {
        return filterProvider; // Compiler reports "Returning address of local
                               // variable or temporary"
    }
};

我在这里看不到关于 filterProvider 的本地或临时内容;我返回的是类的成员变量,而不是临时变量。 (如果我实际上返回了一个局部变量或类似的东西,警告就有意义了)

具体的警告是:

warning C4172: returning address of local variable or temporary.

最佳答案

你的共享指针声明为类型

boost::shared_ptr<FilterProvider>

你回来了

boost::shared_ptr<const FilterProvider>

通过常量引用。看到区别了吗?

类型不一样,但前者可以转换为后者,编译器调用转换。转换的结果不是左值,而是一个临时对象,这意味着您将返回一个绑定(bind)到临时对象的 const 引用。这是合法的初始化方式,但是临时对象将在函数返回之前被销毁。因此在调用代码中引用将无效,这是编译器警告您的内容。

关于c++ - 为什么将 shared_ptr<T> 作为 shared_ptr<const T> 返回会导致 "returning address of temporary"警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3267541/

相关文章:

c++ - 指向成员函数的指针与指向数据成员的指针有何不同?

c++ - 如何通过 vector::pointer push_back vector 中的数据?

visual-studio - Visual Studio 测试项目可以处理事件和委托(delegate)吗?

c# - 单元格事件参数中的动态 DataGridView 引用

c# - 如何重命名在 ASP.NET 5 Web 项目中用作 Web 根目录的 "wwwroot"文件夹

c++ - 在 C++ 中将队列实例化为类成员

c++ - 如何在 C/C++ 中获取多维数组的列?

C++控制台插入文本而不覆盖

visual-studio - 项目文件不完整,在更新的 Visual Studio 2017 上找不到 NETCore.App 2.1

c# - 默认/相对路径解析在 .NET 中如何工作?