Fehler: die Verwendung der Funktion gelöscht. Warum?

Ich versuche, eine Funktion erstellen, gilt ein beliebiger Funktor F zu jedem element eines bereitgestellten Tupel:

#include <functional>
#include <tuple>

//apply a functor to every element of a tuple
namespace Detail {

template <std::size_t i, typename Tuple, typename F>
typename std::enable_if<i != std::tuple_size<Tuple>::value>::type
ForEachTupleImpl(Tuple& t, F& f)
{
    f(std::get<i>(t));
    ForEachTupleImpl<i+1>(t, f);
}

template <std::size_t i, typename Tuple, typename F>
typename std::enable_if<i == std::tuple_size<Tuple>::value>::type
ForEachTupleImpl(Tuple& t, F& f)
{
}

}

template <typename Tuple, typename F>
void ForEachTuple(Tuple& t, F& f)
{
    Detail::ForEachTupleImpl<0>(t, f);
}

struct A
{
    A() : a(0) {}
    A(A& a) = delete;
    A(const A& a) = delete;

    int a;
};

int main()
{
    //create a tuple of types and initialise them with zeros
    using T = std::tuple<A, A, A>;
    T t;

    //creator a simple function object that increments the objects member
    struct F
    {
        void operator()(A& a) const { a.a++; }
    } f;

    //if this works I should end up with a tuple of A's with members equal to 1
    ForEachTuple(t, f);
    return 0;
}

Live-code-Beispiel: http://ideone.com/b8nLCy

Ich will nicht, um Kopien zu erstellen von A weil könnte es teuer werden (natürlich in diesem Beispiel ist es nicht) gelöscht da ich den copy-Konstruktor. Wenn ich das obige Programm habe ich bekommen:

/usr/include/c++/4.8/tuple:134:25: error: use of deleted function A::A(const A&)’
       : _M_head_impl(__h) { }

Ich weiß, dass der Konstruktor wird gelöscht (das war absichtlich), aber was ich nicht verstehe, ist, warum es wird versucht, Kopien von meiner Struktur. Warum ist das passiert und wie kann ich das erreichen, ohne Sie zu kopieren A?

Gibt es nicht eine Art von call-stack, der zeigt, was versucht, das Tupel copy-Konstruktor?
Denn dies ist ein boost-Verwandte Frage, ich würde vorschlagen, das hinzufügen der boost-tag.
Es ist wirklich nicht. Es ist eine Frage, warum std::tuple versucht zu kopieren Ihrer Mitglieder in den ersten Platz.
Ist dies verursacht durch T t(0,0,0); oder durch ForEachTuple(t,f); oder in der ForEachTuple Umsetzung? (Kommentar Dinge, bis Sie finden, was eine exakte Linie zu dem Fehler führen)
Ich habe geändert, die Frage, um loszuwerden, steigern, und fügte einen link zu einem live-Beispiel.

InformationsquelleAutor quant | 2014-11-05

Schreibe einen Kommentar