"矢量<常量T>"的使用
usage of `vector<const T>`
#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>
实现更多
相关文章:
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 什么时候在C++中返回常量引用是个好主意
- 代理对象的常量正确性
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 通过多个头文件使用常量变量
- 在cuda线程之间共享大量常量数据
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 是默认情况下分配给char数组常量的值
- 私有类型的静态常量成员
- 类似枚举的计算常量
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 为什么我可以通过引用修改常量返回
- 如何创建长度由常量参数指定的数组
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 隐式常量/非常量运算符布尔
- 非常量变量只读位置的赋值
- EASTL矢量<向量<int>>连续的