存在類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