Visual Studio 2010 et std :: function
J'ai ce code:
#include <iostream>
#include <functional>
struct A
{
int operator()(int i) const {
std::cout << "F: " << i << std::endl;
return i + 1;
}
};
int main()
{
A a;
std::tr1::function<int(int)> f = std::tr1::ref(a);
std::cout << f(6) << std::endl;
}
Le but est de passer le foncteur de l'objet par un reference_wrapper, de manière à éviter d'inutiles copie costructor appels.
J'attends la sortie suivante:
F: 6
7
Il fonctionne correctement avec GCC >= 4.4.0, Visual Studio 2008 et avec boost en substituant std::tr1 espace de noms avec boost. Il ne fonctionne pas avec le nouveau Visual Studio 2010 Express Beta 2 et Release Candidate.
Ce sont de nouvelles fonctionnalités C++ buggé dans vs2010?
Ou il y a une erreur ou d'abus dans le code?
source d'informationauteur Dj Gaspa
Vous devez vous connecter pour publier un commentaire.
Je pense que j'ai trouvé la raison. C'est ce que TR1
3.4/2
dit à propos deresult_of<T(A1, A2, ..., AN)>::type
utilisée dans la détermination du type de retour dereference_wrapper<T>::operator()
:Et en vertu de l'alinéa 3:
Le message d'erreur est un artefact d'essayer ces replis. Fournir un typedef pour
result_type
àint
et cela devrait fonctionner, je pense. Remarquez que dansC++0x
ce qui est différent. Il ne repose pas surresult_type
ou unresult
modèle, car il peut utiliserdecltype
.Si avec
<functional>
il échoue avec MSVC10 dans C++0x mode, il sent comme un bug, je dirais. Mais peut-être quelqu'un d'autre sait ce qu'il se passe. Il se peut (mais n'est pas garanti) travailler avec<tr1/functional>
dans C++0x mode si cet en-tête choisit de prendre ladecltype
voie au lieu de::result_type
. Je typedefresult_type
- de cette façon, je pense qu'il devrait toujours fonctionner indépendamment du fait que letr1
en-tête est utilisé ou lec++0x
en-tête.Également remarquer que
boost::tr1
dit dans sa documentation qu'il ne prend pas en charge la fonction d'appel de l'opérateur (mais il soutient simplement de conversions implicites àT&
).Je rencontre un problème similaire ici :
D'éviter les copies de C++ foncteur objets
À faire compiler sur MSVC10, j'ai dû tirer mon objet de fonction de std::unary_function.