boostorg / boostorg/graph

`depth_first_visit_impl`: `finish_edge` not invoked when it should on MSVC

Abierto
#345 2 comentarios 0 reacciones 1 asignado Reclamado por @jeremy-murphy Ver en GitHub
algorithm priority: medium
Lenguaje dominante
C++
Estrellas
392
Forks
239
Merge medio
1 d 11 min
PR fusionados (30 d)
20

Descripción

Lines 94-104 in depth_first_search.hpp:

```c++
template < typename E, typename G, typename Vis >
void call_finish_edge(Vis& vis, E e, const G& g)
{ // Only call if method exists
#if ((defined(__GNUC__) && (__GNUC__ > 4) \
|| ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 9))) \
|| defined(__clang__) \
|| (defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1200)))
do_call_finish_edge< has_member_function_finish_edge< Vis, void,
boost::mpl::vector< E, const G& > >::value >::call_finish_edge(vis,
e, g);
#else
do_call_finish_edge< has_member_function_finish_edge< Vis,
void >::value >::call_finish_edge(vis, e, g);
#endif
}
```

On MSVC, the section after the `#else` will not call `Vis::finish_edge` even when it is available and has the correct signature because `has_member_function_finish_edge::value` is `false`. I think this is because instead of checking that `Vis::finish_edge` exists and has return type `void` as was seemingly intended, it in facts checks that it has the exact signature `void()`. So on MSVC, even when providing a visitor type with a correct `void finish_edge(E, const G&)`, it is never called.

I don't know how to fix this because I don't know why it was determined that some compilers should be treated differently here.

I circumvented the bug in my code by adding a dummy `void finish_edge() {}` member function in my visitor type next to the actual `void finish_edge(E, const G&)` function just so the member function detection would yield `true`.

Alternatively this could be a bug in boost/tti/has_member_function.hpp but I guess that's less likely.

Guía de contribución

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.