C++ 编译错误-std::set带有常量成员
我一辈子都搞不清楚这个代码到底出了什么问题:C++ 编译错误-std::set带有常量成员,c++,C++,我一辈子都搞不清楚这个代码到底出了什么问题: ClassA & doSomething (std::set<boost::shared_ptr<ClassB const> const > const & someSet) { std::set<boost::shared_ptr<ClassB> > secondSet; for (std::set<boost::shared_ptr<ClassB const>
ClassA & doSomething (std::set<boost::shared_ptr<ClassB const> const > const & someSet)
{
std::set<boost::shared_ptr<ClassB> > secondSet;
for (std::set<boost::shared_ptr<ClassB const> const >::const_iterator it = someSet.begin(); it != someSet.end(); it++)
{
if (checkSomething(*it))
secondSet.insert(boost::const_pointer_cast<ClassB>(*it));
}
}
但这意味着我将无法在代码中强制执行const正确性
我想你可能错了。只要它是指向常量对象的智能指针,就只能操作集合中的指针,而不能操作引用的对象。这是一个完整的点,因为一个集合若不能接触到这些值,它就不能组织自己
这是两者之间的经典区别
const char* x; // pointer to const char
const char* const x; // constant pointer to const char
char* const x; // constant pointer, to non-const char
只有这一次使用smartpointers。您还可以亲自验证此简单测试是否会因常量项而失败:
#include <set>
int main()
{
std::set<const int> a;
a.insert(1);
return 1;
}
#包括
int main()
{
std::设置a;
a、 插入(1);
返回1;
}
一旦删除“const”,它就会工作
OT:如果您想要一些具有某种“密钥”保护的容器,您可能应该查看map,因为在value_类型(std::pair)中,密钥(.first)始终是const-IIRC。关于容器元素的const正确性,我仍然认为这一点是没有意义的。我确实需要boost来尝试,但我认为您应该const ClassB,而不是shared\u ptr,
尝试删除中间常量(在共享的ptr上)。§23.1/3规定
std::set
键类型必须是可分配和可复制的;很明显,常量类型是不可分配的。这不是“例外”。它是编译错误,所以不可能创建具有const成员的集合。更新的SNOWER应该是确信的不是对象的属性而不是对象的类型吗?@ SEHE,例如,C++中有两种“int”类型,即常态int和常数int。“const限定符将数据对象显式声明为无法更改的内容”。你愿意详细说明你的答案吗?@celavek:不太愿意,但我的尝试是:X
隐式转换为const X
,但不是相反。只有const
方法可以通过const对象/指针调用。指向常量的指针也是如此types@sehe我真的意识到了这一点,但我并没有谈论这一点。你在第一条评论中否定(或否定地回答)了我的问题,说常量不是对象的属性,而是对象的类型。但既然你不想详细说明,那我们就不谈了。@celavek:我很乐意详细说明,但我不明白你的困惑在哪里const
-ness(和volatile
-ness)确实是类型的一部分。
const char* x; // pointer to const char
const char* const x; // constant pointer to const char
char* const x; // constant pointer, to non-const char
#include <set>
int main()
{
std::set<const int> a;
a.insert(1);
return 1;
}