#include <memory>
template <typename T>
class Wrapper {
public:
Wrapper() = delete;
Wrapper(const Wrapper&) = delete;
Wrapper(Wrapper&&) = delete;
~Wrapper() = default;
Wrapper(const T&) = delete;
Wrapper(T&& in) : instance{std::move(in)} {}
T instance;
};
void foo(Wrapper<std::shared_ptr<int>>) {}
int main() {
auto ptr = std::make_shared<int>(1);
foo(std::move(ptr));
}
Cela a fonctionné en C++ 17 donc je ne l'ai jamais pensé mais pourquoi ce code essaye-t-il d'invoquer le constructeur de déplacement en C++ 14 ? Ne devrait-il pas être construit en place dans l'argument de la fonction? Cela ne semble pas être un problème avec C++ 17 mais ne compile pas avec C++ 14.Copier le paramètre invoque le constructeur supprimé lorsque ce constructeur ne devrait pas être appelé
La seule solution de contournement que je vois est de rendre le paramètre foo
un rvalue, mais y at-il quelque chose que je peux faire pour que cela fonctionne sans faire du paramètre foo
un rvalue en C++ 14?
Ma première pensée serait qu'un serait temporaire doivent être constructeur afin d'être transmis à la fonction, mais ce qui est encore plus surprenant est que même avec -fno-elide-constructors
et Annulation de la suppression des déplacement constructeurs et copier les constructeurs ceux ne le font pas semble être appelé! Est-ce un bug dans gcc et clang tous les deux?
Voir https://wandbox.org/permlink/f6sa5Rm3NxZLy5P1 l'erreur Et voir le comportement étrange https://wandbox.org/permlink/Kh6CG4OVbUAjvEZz
quelles sont les erreurs exactes que vous obtenez – vu1p3n0x
@ vu1p3n0x les a publiées dans la question, il était dans le titre ainsi – Curious
Dans votre lien pour « voir le comportement étrange », il fait constructeur de déplacement d'appel –