为什么将shared_ptr <T>作为shared_ptr <const T>返回会导致"返回临时地址"警告?

Bil*_*eal 2 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"
    }
};
Run Code Online (Sandbox Code Playgroud)

我不知道filterProvider这里有什么地方或临时的; 我正在返回看起来像是类的成员变量的东西,而不是临时的.(如果我实际上返回了一个局部变量或类似的东西,警告会有意义)

具体警告是:

warning C4172: returning address of local variable or temporary.
Run Code Online (Sandbox Code Playgroud)

AnT*_*AnT 5

您的共享ptr是使用类型声明的

boost::shared_ptr<FilterProvider>
Run Code Online (Sandbox Code Playgroud)

你回来了

boost::shared_ptr<const FilterProvider>
Run Code Online (Sandbox Code Playgroud)

通过const引用.看到不同?

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