c ++ добавляет данные в std :: vector, содержащий std :: tuple - PullRequest
0 голосов
/ 28 ноября 2018

Ниже приведен код, который добавляет элементы в вектор, содержащий std::pair

std::vector<std::pair<std::string, std::type_index>> args_;

template <class T>
            inline OperationEntry& setArg(const std::string& name)
            {
                args_.push_back({name, typeid(T)});
                return *this;

            }

Как добавить элементы в вектор, содержащий std::tuple?

std::vector<std::tuple<std::string, std::type_index, Attribute>> args_;

template <class T>
            inline OperationEntry& setArg(const std::string& name, Attribute value = Attribute())
            {
                args_.push_back({name, typeid(T), value});
                return *this;

            }

Iпробовал args_.push_back(std::make_tuple(name, typeid(T), value));

Я получаю эту ошибку:

[GCC] converting to
‘std::vector<std::tuple<std::__cxx11::basic_string<char,
std::char_traits<char>, std::allocator<char> >, std::type_index,
mv::Attribute> >::value_type {aka
std::tuple<std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> >, std::type_index, mv::Attribute>}’ from
initializer list would use explicit constructor ‘constexpr std::tuple<
<template-parameter-1-1> >::tuple(_UElements&& ...) [with _UElements =
{const std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> >&, const std::type_info&, mv::Attribute&};
<template-parameter-2-2> = void; _Elements =
{std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> >, std::type_index, mv::Attribute}]’

1 Ответ

0 голосов
/ 28 ноября 2018
args_.push_back({name, typeid(T), value});

До N4387 , конструктор std::tuple, использованный для вышеуказанной инициализации, был безусловно explicit, и если он был выбран разрешением перегрузки в инициализации copy-list-инициализации, компилятор был разрешенвызвать ошибку.


args_.push_back(std::make_tuple(name, typeid(T), value));

Приведенный выше вызов попытается использовать конструктор копирования для экземпляра std::type_info, который не подлежит копированию.


InЧтобы создать кортеж в реализации, предшествующей N4387, используйте emplace_back:

args_.emplace_back(name, typeid(T), value);

или отодвиньте кортеж типов, копируемых для копирования:

args_.push_back(std::make_tuple(name, std::type_index{typeid(T)}, value));
//                                         ~~~~~~~~~^
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...