考虑与之前的 SO 问题相关的代码C++ 循环依赖与邻接列表表示的混淆
#include <cstddef>
#include <unordered_set>
class Node;
class Hash {
public:
std::size_t operator()(const Node &node) const;
};
class Node {
public:
int data;
std::unordered_set<Node, Hash> links;
};
inline size_t Hash::operator()(const Node &node) const {
return node.data;
}
int main()
{
}
此代码在使用 g++4.9.2 或 g++5 时无法编译,但可以使用 clang++3.5 进行编译。
g++ 吐出的错误以
error: invalid application of 'sizeof' to incomplete type 'Node'
: std::aligned_storage<sizeof(_Tp), std::alignment_of<_Tp>::value>
问题: Does Node
声明时必须是完整类型std::unordered_set
?在这种情况下,看起来 g++ 或 clang++ 都是错误的。
PS:我知道这种情况可以通过使用来避免std::shared_ptr<Node>
相反,但是想了解上面代码中的行为。
使用不完整类型实例化标准库容器是未定义的行为。 [函数解析]/1, 2.5:
1 在某些情况下(替换函数、处理函数、
对用于实例化标准库模板的类型的操作
组件),C++ 标准库取决于提供的组件
通过 C++ 程序。如果这些组件不满足其要求,
本标准对实施没有提出要求。
2 特别是,以下情况的影响未定义:
- [...]
- 如果在实例化模板组件时使用不完整类型(3.9)作为模板参数,除非特别允许
该组件。
两种实现都是正确的。
目前有一个proposal为某些容器添加不完整的类型支持,但仅限于vector
, list
and forward_list
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)