假设我要在条目之间保持一定顺序
unordered_map
startAfter()
这是有效的C ++吗? Clang和gcc不允许这样说Node是不完整的类型。有关完整的错误消息,请参见下文。双方都接受以下内容:
struct Node {
int val;
typename std::unordered_map<int, Node>::iterator up;
};
这里的规则到底是什么?为什么第一个不被接受但是第二个很好呢?在相关的question中,出现了类似的问题,但是,要在此处应用相同的解释,必须是unordered_map包含一个Value对象而没有任何间接引用。即unordered_map的定义应如下所示:
template<typename Key, typename Value>
struct Map {
struct MapEntry {
Key key;
Value val;
MapEntry *prev, *next;
};
using Iterator = MapEntry*;
};
struct Node {
int val;
Map<int, Node>::Iterator up;
};
我不明白为什么unordered_map应该直接存储值。除此以外, 就像我在上面给出的玩具示例struct Map中一样,没有依赖周期。
template<typename Key, typename Value>
class unordered_map {
Value val;
using value_type = std::pair<const Key, Value>;
using entry = std::tuple<value_type, entry*, entry*>;
using iterator = entry*;
};
答案 0 :(得分:1)
A,
struct Node {
int val;
typename std::unordered_map<int, Node>::iterator up;
};
从C ++ 17标准开始, 不是有效的C ++。根据{{3}}最近被C ++ 17接受,向Node
,std::vector
和std::list
提供不完整的类型std::forward_list
是有效的,但是unordered_map仍需提供完整的类型。
MSVC和libc ++可以很好地使用不完整的值,但这是由于它们超出了标准的要求。