可变参数std :: tuple

时间:2019-02-14 17:51:01

标签: c++ templates c++17

我有一个可变参数模板,其中可变参数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 ?
}

0 个答案:

没有答案