Я играю с этой небольшой фрагмент кода:C++ идеальный вперед от копирования только типы в make_tuple
#include <tuple>
struct copy_only
{
copy_only() = default;
copy_only(copy_only&&) = delete;
copy_only(const copy_only&) = default;
};
template <typename ...Ts>
void foo(Ts&& ...xs)
{
auto t = std::make_tuple(std::forward<Ts>(xs)...);
(void) t;
}
int main()
{
foo(copy_only{});
}
Он компилирует штрафа с gcc7 и clang3.6, clang3.7, clang3.8 (Wandbox), и clang8.0 (macOS Sierra). Он не компилируется с clang3.9, g ++ 6.2 (macOS Sierra), а также с clang4.0 (Wandbox). Все они жалуются на конструктор удаленных перемещений.
Он отлично работает с типами перемещения. По крайней мере, на вышеупомянутых компиляторах доступно Wandbox.
Является ли этот код примером правильного пути общей совершенной пересылки в кортеж в C++ 14?
Если вы удалите 'copy_only (copy_only &&) = delete;', этот конструктор не будет сгенерирован, и можно будет выбрать перегрузку копии. В настоящее время конструктор перемещения лучше подходит. – Jarod42
@ Jarod42 это правильно, но зачем он компилируется с gcc и старше clang? – krzaq
@kraz: в C++ 1z 'auto t = ..' выполнит копирование, не требуя копии« существование ». – Jarod42