Скопировать оператор присваивания для variadic std :: tuple - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть шаблон с переменным числом с переменным std :: tuple в качестве члена.

Я объявил оператор присваивания по умолчанию.

MSVC жалуется, что оператор удален.Я все еще могу запустить программу.

Она не дает ожидаемого результата.

Итак, мне на ум приходят 3 вопроса:

Почему оператор копирования по умолчанию не генерируется дажеесли помечено как значение по умолчанию?

Почему я могу запустить программу по-прежнему с опубликованным кодом?

Как объявить оператор присваивания для std::tuple<T...> шаблона?

#include <string>
#include <iostream>
#include <tuple>

template<typename ...T>
class Variadic
{
public:
    explicit Variadic(T... args)
        :m_data{ std::move(args)... }
    {
    }

    Variadic& operator=(const Variadic&) = default;

    template<typename Type>
    Type get_element() const
    {
        return std::get<Type>(m_data);
    }
private:
    std::tuple<T...> m_data{};
};

int main()
{
    Variadic<int, std::string> tuple1{ 1, "a" };
    Variadic<int, std::string> tuple2{ 2, "b" };

    std::cout << tuple1.get_element<int>() << '\n';     // 1
    std::cout << tuple1.get_element<std::string>() << '\n'; // a
    std::cout << tuple2.get_element<int>() << '\n'; // 2
    std::cout << tuple2.get_element<std::string>() << '\n';  // b

    tuple2 = tuple1;    // MSVC2017 gives warning here:
    //function "Variadic<T...>::operator=(const Variadic<T...> &) [with T=<int, std::string>]" 
    //(declared at line 13) cannot be referenced -- it is a deleted function
    // still it compiles ???

    std::cin.get();

    std::cout << tuple1.get_element<int>() << '\n'; // 1
    std::cout << tuple1.get_element<std::string>() << '\n'; // a
    std::cout << tuple2.get_element<int>() << '\n'; // expect 1 but 2 ?
    std::cout << tuple2.get_element<std::string>() << '\n';  // expect b but a ?
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...