boost + gcc = bug sur les tests d'existence de fonction libre.
Bonjour à tous,
J'utilise boost 1.57 pour tester l'existence d'un opérateur << avec mingw 4.7 et je remarque un comportement plutôt perturbant avec le code ci-dessous.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| #include <boost/type_traits/has_operator.hpp>
#include <ostream>
#include <iostream>
#define BUG
class Test
{
};
#ifdef BUG
bool debBoost = boost::has_left_shift<std::ostream&, const Test&, std::ostream&>::value;
#endif
std::ostream& operator<<(std::ostream&, const Test&);
bool endBoost = boost::has_left_shift<std::ostream&,const Test&, std::ostream&>::value;
int main()
{
#ifdef BUG
std::cout<<"debBoost = "<<debBoost<<"\n";
#endif
std::cout<<"endBoost = "<<endBoost<<"\n";
} |
Globalement, si j'active BUG, debBoost = endBoost = 0, sinon, endBoost =1. Est-ce un comportement normal ?
Ensuite, j'ai voulu tester une solution maison (juste pour ce cas). La voici :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #include <ostream>
#include <iostream>
#include <type_traits>
class Test
{
};
struct delay
{
template<typename T>
delay(const T&);
};
std::false_type operator<<(std::ostream&, delay);
bool deb = !std::is_same<decltype(std::declval<std::ostream&>() << std::declval<const Test&>()), std::false_type>::value;
std::ostream& operator<<(std::ostream&, const Test&);
bool end = !std::is_same<decltype(std::declval<std::ostream&>() << std::declval<const Test&>()), std::false_type>::value;
int main()
{
std::cout<<"deb = "<<deb<<"\n";
std::cout<<"end = "<<end<<"\n";
} |
Et je n'ai pas eu de soucis...
Ce problème est-il uniquement chez moi ?
Finalement, après un troisième test, le problème ne vient pas de boost puisque j'obtiens les même résultats que boost.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| #include <ostream>
#include <iostream>
#include <type_traits>
#define BUG
class Test
{
};
struct delay
{
template<typename T>
delay(const T&);
};
std::false_type operator<<(std::ostream&, delay);
template<typename T>
struct Has
{
static constexpr bool value = !std::is_same<decltype(std::declval<std::ostream&>() << std::declval<const T&>()), std::false_type>::value;
};
#ifdef BUG
bool deb = Has<Test>::value;
#endif
std::ostream& operator<<(std::ostream&, const Test&);
bool end = Has<Test>::value;
int main()
{
#ifdef BUG
std::cout<<"deb = "<<deb<<"\n";
#endif
std::cout<<"end = "<<end<<"\n";
} |
Je suppose que tout ce ci est normal... Est-il possible de faire pour que la valeur soit évaluée lorsqu'elle est demandée et non à la première demande ?
[EDIT] Je n'ai testé le deuxième code qu'après avoir commencé à éditer le message, et je ne pensais pas que le problème venait de boost (je pensais que ma solution allait échouer elle aussi). Quelqu'un pourrait-il déplacer la conversation dans le forum dédié à boost ?
[EDIT2] Finalement, ce n'est pas lié à boost