【发布时间】:2021-10-12 06:39:25
【问题描述】:
我有以下结构静态方法:
template<typename Edge1, typename Edge2, typename... Edges>
requires std::derived_from<Edge1, Edge> && std::derived_from<Edge2, Edge> && (std::derived_from<Edges, Edge> && ...)
[[nodiscard]] static constexpr bool are_multi_edges(const Edge1& edge1, const Edge2& edge2, const Edges&... edges)
{
// If only two edges were passed to the function, there's no need for any extra logic.
if constexpr (sizeof...(edges) == 0)
return edge1 == edge2;
// Problem here //
std::array<Edge, sizeof...(edges) + 1> array {edge2, edges...};
// Problem here //
for (auto& [from, to] : array)
if (from != edge1.from || to != edge1.to)
return false;
return true;
}// with "Edge" being the name of the actual struct housing the static method.
强调 std::arrayEdge, ........ > ..
如果我让“Edge”保持原样,代码可以编译并正常工作,但我怀疑它会将edge2 和edges 复制到数组中,这是不必要的。我尝试用“Edge&”替换“Edge”以避免复制并得到以下错误:
/usr/include/c++/10/array: In instantiation of ‘struct std::array<Edge<>&, 1>’:
/home/selamba/CLionProjects/graphs_lol/graph.h:41:43: required from ‘static constexpr bool Edge<VertexType>::are_multi_edges(const Edge1&, const Edge2&, const Edges& ...) [with Edge1 = Edge<>; Edge2 = Edge<>; Edges = {}; VertexType = char]’
/home/selamba/CLionProjects/graphs_lol/main.cpp:13:51: required from here
/usr/include/c++/10/array:97:35: error: forming pointer to reference type ‘std::array<Edge<>&, 1>::value_type’ {aka ‘Edge<>&’}
97 | typedef value_type* pointer;
| ^~~~~~~
主要内容是“形成指向引用类型的指针”。这只是错误消息的顶部,因为实际消息非常庞大。所有的错误实际上都在“array”头文件中(usr/include/c++/10/array)。
是否可以在我的用例中形成边缘引用的 std::array ?如果是这样,我该怎么做?
【问题讨论】:
标签: c++ pointers templates reference