Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.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++ 什么是未知大小的共享?_C++_Arrays_Boost_Shared Ptr_Make Shared - Fatal编程技术网

C++ 什么是未知大小的共享?

C++ 什么是未知大小的共享?,c++,arrays,boost,shared-ptr,make-shared,C++,Arrays,Boost,Shared Ptr,Make Shared,在答复中,T.C.表示: boost::使_共享等。支持数组类型-未知类型之一 大小,或固定大小的一个 boost::shared_ptr sh_arr2=boost::make_shared(30); boost::shared_ptr sh_arr3=boost::make_shared(); 首先,如何使_共享支持大小未知的数组类型?我认为数组大小是必需的 第二,SHU arr2和SHU arr3的区别是什么?两者似乎都在创建一个int大小为30的数组。这个示例并没有那么好。对于大小未知

在答复中,T.C.表示:

boost::使_共享
等。支持数组类型-未知类型之一 大小,或固定大小的一个

boost::shared_ptr sh_arr2=boost::make_shared(30);
boost::shared_ptr sh_arr3=boost::make_shared();
首先,如何使_共享支持大小未知的数组类型?我认为数组大小是必需的


第二,SHU arr2和SHU arr3的区别是什么?两者似乎都在创建一个int大小为30的数组。

这个示例并没有那么好。对于大小未知的数组,它们可能意味着可以通过以下方式调用它:

int arr2_size = 30;
boost::shared_ptr<int[]> sh_arr2 = boost::make_shared<int[]>(arr2_size);
int arr2_size=30;
boost::shared_ptr sh_arr2=boost::make_shared(arr2_大小);
由于
arr2_size
可以动态定义,因此可以将其视为“未知”

其次,它们都会创建一个大小为30的数组,但是
sh_arr3
在类型本身中包含大小,这将允许编译器在访问超出边界时发出警告。没有显式大小的类型将无法检测这些情况

首先,如何使_共享支持大小未知的数组类型?我 我认为数组大小是必需的

Boost使用助手类来确定其
共享的\u ptr::operator[](…)
的返回类型。它还使用另一个帮助器类
boost::detail::sp_extent
,该类为数组类型提供专门化来确定边界(如果
T
可以分解为
T[]
),下面是一个摘要片段:

namespace boost{
模板
类共享\u ptr{
.....
typename boost::detail::sp_array_access::type operator[](std::ptrdiff_T i)const
{
BOOST_断言(px!=0);
BOOST|u ASSERT(i>=0&&(i::value | | BOOST::detail::sp_extent::value==0));
返回静态_cast::type>(px[i]);
}
....
}
名称空间详细信息{
模板结构sp\u数组\u访问
{typedef void type;};
模板struct sp\u array\u访问
{typedef T&type;};
模板struct sp\u array\u access
{typedef T&type;};
模板结构sp\u范围
{enum_vt{value=0};};
模板struct sp\u区段
{enum_vt{value=N};};
}//结束名称空间详细信息
}//结束命名空间提升
第二,SHU arr2和SHU arr3的区别是什么?两者似乎都是 要创建整数大小为30的数组

第二个包括范围检查。发件人:

从Boost release 1.53开始,shared_ptr可用于保存 指向动态分配数组的指针。这是通过 使用数组类型(T[]或T[N])作为模板参数。有 使用未调整大小的数组T[]和调整大小的数组几乎没有区别 数组,T[N];后者只允许运算符[]执行范围 检查索引

int arr2_size = 30;
boost::shared_ptr<int[]> sh_arr2 = boost::make_shared<int[]>(arr2_size);
namespace boost{
template<typename T>
class shared_ptr{
   .....
    typename boost::detail::sp_array_access< T >::type operator[] ( std::ptrdiff_t i ) const
        {
            BOOST_ASSERT( px != 0 );
            BOOST_ASSERT( i >= 0 && ( i < boost::detail::sp_extent< T >::value || boost::detail::sp_extent< T >::value == 0 ) );

            return static_cast< typename boost::detail::sp_array_access< T >::type >( px[ i ] );
        }
    ....
}

namespace detail{

    template< class T > struct sp_array_access
    { typedef void type; };

    template< class T > struct sp_array_access< T[] >
    { typedef T & type; };

    template< class T, std::size_t N > struct sp_array_access< T[N] >
    { typedef T & type; };



    template< class T > struct sp_extent
    { enum _vt { value = 0 }; };

    template< class T, std::size_t N > struct sp_extent< T[N] >
    { enum _vt { value = N }; };
}//end namepace detail
}//end namespace boost