在接受std::set元素地址时,从' const int* '到' int* '的转换无效
Invalid conversion from ‘const int*’ to ‘int*’ while taking std::set element address
我得到以下错误error: invalid conversion from ‘const int*’ to ‘int*’
下面是我的程序
#include <set>
int main ( int argc, char **argv) {
std::set<int> intSet;
intSet.insert(1);
intSet.insert(2);
intSet.insert(3);
intSet.insert(4);
intSet.insert(5);
int *pAddress = &(*(intSet.find(4)));
}
我想要std::set
中元素的地址,这段代码在Microsoft编译器中没有给出任何编译错误,但是g++
给出了这个编译错误。
这是因为std::set
的每个元素都被存储为T const
,并且实现有理由这样做。
因为std::set
只包含一个值的一个副本。它必须使不可变,否则,可以将它的值更改为集合中已经存在的值。
即使元素是可变的,你也不能改变值,因为std::set::find
是const
成员函数,因此在这个函数中intSet
是不可变的,实际上每个元素也会变成不可变的,包括它返回的迭代器,通过可以在调用点改变值。
唯一要取的地址是:
int const *paddress = &(*(intSet.find(4))); //const int* is same as int const*
不要使用const_cast
,
//DANGEROUS - DONT DO IT
int *paddress = const_cast<int*>(&(*(intSet.find(4)))); //will compile,
//but it is dangerous!
//you might accidentally write
*paddress = 10; //undefined behaviour,
//though the compiler will let you write this
GCC将set::iterator
定义为set::const_iterator
,防止将非const
引用或指针绑定到set::find()
的结果。此行为在c++ 11中是允许的(声明键是不可变的,并且set::iterator
是常量迭代器),但在c++ 03中是不正确的。
在c++ 03中,不应该修改集合的元素,因为这会破坏集合中元素的顺序。在某些情况下,您可能希望—如果类型是一个类,并且只有一些成员用于定义排序,那么修改其他成员是有效的。c++ 03标准允许这样做,但您必须小心不要修改顺序,因为这会产生未定义的行为。在c++ 11中,这是不允许的,并且实现可能会阻止这一点。
在你的例子中,你根本不能合法地修改这个值,所以你可以为c++ 11修改你的代码,并通过绑定到指向const的指针来提高它的安全性。
int const *pAddress = &(*(intSet.find(4)));
集合的值是不可变的,这样类就可以保证所有元素都是唯一的。给你一个非const
的指针会让你很容易改变值,这会破坏set模板类的设计(http://msdn.microsoft.com/en-us/library/e8wh7665(VS.80).aspx)。
你应该改变最后一行,在它前面加一个"const",像这样:
const int *pAddress = &(*(intSet.find(4)));
仅供参考:您的代码在Visual Studio 2010中给出了相同的编译错误。
- 'max'匹配'std::function<const int &(const int &, const int &)>'无过载
- 在C++中,如果"int a = 3; int* p = &a;",那么为什么不允许"const int* &pp = p",但允许"const int* const &pp = p"?
- 调用'myStud::myStud(int, const char [5], int, int, int)'没有匹配函数
- 返回对象时从'const DList<int>* const'到 'DList<int>*' [-fallowive] 的转换无效
- int(int)& 或 int(int) const &是什么类型?
- 传递 const int* 和 int* 时调用重载函数的不同版本(const int* const&/&&)
- 如何在构造函数中初始化int const * const
- 对"displayForStudent(int, int const*, double const*, int)"的未定义引用 collect2.exe:错误:ld 返回 1 个退出状态
- 如何在 C++ 中解释"const int *const & variable"
- 为什么"int & const" MSVC 编译得很好?
- const int const&和const int&in C++有什么区别?
- std::set<int * const> 不会编译
- " invalid operands of types 'int' and 'int* const'" 来自功能的错误,来自书
- std::initializer_list<int const> 不能从 std::initializer_list <int>构造
- 对'std::string Helper::ToString<int>(int const&)'的未定义引用
- 无法弄清楚 int[3][3] 和 int(* const)[3] 之间的区别
- const int* const fun(const int* const& p) const的含义;
- 为什么vector<int * const>是非法/不合逻辑的?
- 对 Stack<int>::p ush(int const&) 的未定义引用
- JsonCpp:未定义的对"Json::Value::operator[](int) const"的引用