存在类A,其中包含两个重载的方法getItems();C++,返回const和非const引用std :: set项
typedef std::vector <int> TItems;
template <typename T>
class A
{
private:
T a;
TItems items;
public:
A(){}
A (const T a_, const TItems & items_) : a(a_) , items (items_) {}
bool operator() (const A <T> &aa) {return a < aa.a;}
TItems const & getItems() const {return items}
TItems & getItems() {return items}
};
和集合A的对象
template <typename T>
struct TSet {typedef std::set <A <T> > Type;};
我想返回const引用/参考TItems,但只有第二个方法效果
int main()
{
TSet <double> ::Type t;
TSet <double> ::Type::iterator it = t.begin();
t.insert (A <double>(5, TItems(10,10)));
const TItems *items = &(it->getItems()); //OK
TItems *items = &(it->getItems()); //Error
}
Error 1 error C2440: 'initializing' : cannot convert from 'const TItems *' to 'TItems *
是它的原因,非常量引用使得能够修改导致潜在重排的A对象。但是集合的项目不是由A.items排列,而是由a排列。
有没有办法使用非常量引用来修改A.items?
技术上'const_cast'是UB为此目的(即使我有罪使用它的情况下,我保证自己的顺序),并且'mutable'不会在这里改变任何东西。不,没有出路:如果你允许用户有可能违反命令,你不应该首先使用'set'。 –
@AlexandreC。请注意详细说明为什么未定义的行为应该发生,如果您从集合元素中删除const并且只更改那些不用于排序的成员?例如,您可以将用于排序的成员声明为const。这并不意味着整个set元素必须是const。 – Kenji