Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么返回共享\u ptr<;T>;作为共享\u ptr<;常数T>;结果是;“临时”的回信地址;警告?_C++_Visual Studio - Fatal编程技术网

C++ 为什么返回共享\u ptr<;T>;作为共享\u ptr<;常数T>;结果是;“临时”的回信地址;警告?

C++ 为什么返回共享\u ptr<;T>;作为共享\u ptr<;常数T>;结果是;“临时”的回信地址;警告?,c++,visual-studio,C++,Visual Studio,您的共享ptr是用类型声明的 class Example { boost::shared_ptr<FilterProvider> filterProvider; public: void RegisterFilter(const boost::shared_ptr<FilterProvider>& toRegister) { filterProvider = toRegister; } const boost

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

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"
    }
};
boost::共享
你回来了

boost::shared_ptr<FilterProvider>
boost::共享
通过常量引用。看到区别了吗


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

filterProvider
的类型是
boost::shared\u ptr
,但您返回(对
boost::shared\u ptr
)的引用(请注意
const
)。就编译器而言,这些类型并不相同。但是,存在隐式转换。这会导致编译器生成一个临时文件,您将返回对该临时文件的引用,而不是对
共享的\u ptr
本身的引用


但是,你为什么要首先给出一个
共享\u ptr
的引用?分发一份
共享的\u ptr
,或者,如果要防止修改,请分发对底层
FilterProvider
对象的
const
引用。

FilterProvider
是指向
FilterProvider
的共享指针,但
GetFilter()
返回指向
常量过滤器提供程序的共享指针的引用

例如,
int
可以被视为
常量int&
,但对于模板来说,情况并非如此。
Foo
Foo
没有任何关系,因此不能被视为
Foo&

Boost提供了从
shared_ptr
shared_ptr
的转换,但此转换涉及创建类型为
shared_ptr
的新临时对象


因此,这里发生的情况是,您试图从一个想要返回
共享ptr&
的函数返回
共享ptr&
。这将调用显式转换,该转换创建一个类型为
shared\u ptr
的新临时对象,然后返回对该对象的引用。因此,您将返回对临时对象的引用。

我想分发对象,但当有人询问尚未设置筛选器时,这是可能的。因此,调用代码需要能够获得空引用。@Pavel:然后他们可以修改目标对象,这是我不希望他们能够做到的。更准确地说,请将指针指向-
const
。换句话说,和你已经做的一样,只需放下
&
。有多个正确答案。检查这个,因为它是第一个发布的。
boost::shared_ptr<const FilterProvider>