"矢量<常量T>"的使用

usage of `vector<const T>`

本文关键字:gt 常量 矢量 lt      更新时间:2023-10-16
#include <iostream>
#include <vector>
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
using namespace std;
struct TestMe
{
    TestMe() : i(10), j(20) {}
    int i;
    int j;
};
int main()
{
   // Case I:
   //vector<const int> vec;
   /*
/usr/local/gcc-4.8.1/include/c++/4.8.1/ext/new_allocator.h:93:7: error: 'const _Tp* __gnu_cxx::new_allocator<_Tp>::address(__gnu_cxx::new_allocator<_Tp>::const_reference) const [with _Tp = const int; __gnu_cxx::new_allocator<_Tp>::const_pointer = const int*; __gnu_cxx::new_allocator<_Tp>::const_reference = const int&]' cannot be overloaded
       address(const_reference __x) const _GLIBCXX_NOEXCEPT   
   */
   // Case II:        
   //vector<const TestMe> vecTest;
   // Case III:
   //boost::shared_ptr<vector<const TestMe>> shVecTestMe;
   //shVecTestMe = boost::make_shared<vector<const TestMe> >( );    
   return 0;
}

我已经在两个编译器中尝试了上面的代码:

1> http://www.compileonline.com/compile_cpp11_online.php

2> MS VS2010

第一个编译器不能接受所有情况(即案例 I、案例 II、案例 III)。但是,MS VS2010 接受所有这些。

问题1>这些案例有意义吗?换句话说,是否有必要使用

vector<const int>
vector<const TestMe>
boost::shared_ptr<vector<const TestMe>>

以防止以后修改包含的值。

问题2>为什么两个编译器对这些情况有不同的反应。根据 c++ 标准,哪一个是正确的?

谢谢

根据定义,const 对象意味着它在创建后不会更改。因此,您无法创建 const int 向量,除非您引用编译中已经存在的 const 对象。

问题是...为什么需要这个?人们会一直改变你的载体吗?

还有其他机制可以强制执行这一点,例如类中的私有向量。

正如注释和可能重复的问题及其答案中所述,这会导致未定义的行为,这就是编译器/库实现行为不同的原因。例如,GCC 的库实现试图通过 const 和非const引用重载方法,如果引用类型已经const,则会失败。

但这也没有意义。你可以说

const vector<int> vec;

我无法想象,如果它有效,你还能用你的vector <const int>实现更多