gpt4 book ai didi

c++ - g++5 中 std::unordered_set 的不完整类型编译错误,在 clang++ 中编译

转载 作者:行者123 更新时间:2023-12-03 06:08:07 24 4
gpt4 key购买 nike

考虑与之前的 SO 问题相关的代码 C++ cyclic dependency confusion with adjacency list representation

#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>

问题:是否 Node声明 std::unordered_set 时必须是完整类型?在这种情况下,看起来 g++ 或 clang++ 都是错误的。

PS:我知道使用std::shared_ptr<Node>可以避免这种情况。但是,我想了解上面代码中的行为。

最佳答案

使用不完整类型实例化标准库容器是未定义的行为。 [函数解析]/1, 2.5:

1 In certain cases (replacement functions, handler functions, operations on types used to instantiate standard library template components), the C++ standard library depends on components supplied by a C++ program. If these components do not meet their requirements, the Standard places no requirements on the implementation.

2 In particular, the effects are undefined in the following cases:

  • [...]
  • if an incomplete type (3.9) is used as a template argument when instantiating a template component, unless specifically allowed for that component.

两种实现都是正确的。

目前有一个 proposal为某些容器添加不完整的类型支持,但仅限于 vectorlistforward_list

关于c++ - g++5 中 std::unordered_set 的不完整类型编译错误,在 clang++ 中编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28911009/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com