http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54506

--- Comment #5 from Nikolka <tsoae at mail dot ru> 2012-09-09 22:42:03 UTC ---
(In reply to comment #4)

These examples aren't similar. An implicitly defined move constructor performs
direct-initialization of non-static data members with the corresponding members
of the argument, which is interpreted as xvalue (12.8/15). In every such a
direct-initialization all constructors are considered (13.3.1.3), including
constructor templates. Template argument for the parameter U can be deduced as
int, and the produced specialization of the constructor template will have
better match than both copy and move constructors.

Similarly for assignment operators.

> struct A cannot be moved because its move operations are deleted

This is not so in my example, and g++ correctly handles the following case:

    template <class T>
        struct A
    {
        A() {}

        A(A const volatile &&) = delete;
        A &operator =(A const volatile &&) = delete;

        template <class U>
            A(A<U> &&) {}
        template <class U>
            A &operator =(A<U> &&) { return *this; }
    };

    int main()
    {
        A<int> a = A<int>(); // OK
        a = A<int>(); // OK
    }

Reply via email to