Это не копирование-инициализация, или это так?

В следующем коде я не могу объявить явный ctor, потому что компилятор говорит, что я использую его в контексте инициализации копирования (clang 3.3 и gcc 4.8). Я пытаюсь доказать, что компиляторы ошибочны, сделав ctor не явным, а затем объявив конструкторы копирования как удаленные.

Являются ли компиляторы неправильными или есть какие-либо другие объяснения?

#include <iostream>

template <typename T>
struct xyz
{
    constexpr xyz (xyz const &)    = delete;
    constexpr xyz (xyz &&)         = delete;
    xyz & operator = (xyz const &) = delete;
    xyz & operator = (xyz &&)      = delete;
    T i;
    /*explicit*/ constexpr xyz (T i): i(i) { }
};

template <typename T>
xyz<T> make_xyz (T && i)
{
    return {std::forward<T>(i)};
}

int main ()
{
    //auto && x = make_xyz(7);
    auto && x (make_xyz(7)); // compiler sees copy-initialization here too
    std::cout << x.i << std::endl;
}

Обновление Неверная, но гораздо более простая версия

struct xyz {
    constexpr xyz (xyz const &) = delete;
    constexpr xyz (xyz &&) = delete;
    xyz & operator = (xyz const &) = delete;
    xyz & operator = (xyz &&) = delete;
    int i;
    explicit constexpr xyz (int i): i(i) { }
};

xyz make_xyz (int && i) {
    return {i};
}

int main () {
    xyz && x = make_xyz(7); 
}

Ответ 1

Обозначение = не должно влиять на жалобу, потому что привязка ссылок не ведет себя иначе, независимо от того, выражена ли она посредством прямой или копии. Здесь инициализируется объект возвращаемого значения, который не имеет собственного имени.

К сожалению, GCC прав жаловаться, как и Clang. Согласно §6.6.3/2 [stmt.return],

Оператор return с бинтом-init-list инициализирует объект или ссылку, которые будут возвращены из функции путем инициализации-списка-инициализации (8.5.4) из указанного списка инициализаторов.

Итак, там есть невидимый знак =, и вы не можете обойти его.