Этот код работает в Visual Studio:
typedef struct {
int a;
} data_t;
using datap_t = std::unique_ptr<data_t>;
using MyPair = std::pair<std::string, datap_t>;
int main() {
data_t * pd1 = new data_t();
MyPair p("tst", pd1); // This does not compile in gcc or clang
// MyPair p2("tst", datap_t(pd1)); // This compiles
return 0;
}
Но clang и gcc дают ошибку:
error: no matching function for call to 'std::pair<const std::basic_string<char>, std::unique_ptr<data_t> >::pair(const char [3], data_t*&)
Вот идея, которую стоит попробовать.
Тот факт, что я могу вызвать datap_t(pd1)
и он компилируется, означает, что конструктор действителен, так почему же этот шаблон не находит подходящего соответствия?
Я хотел добавить пару ключ-значение на карту с помощью emplace, и именно поэтому я хотел иметь это неявное преобразование в первую очередь. Обратите внимание, что, как и в Visual Studio, неявное преобразование работает для большинства других типов, таких как std::string
из "raw string"
.
Этот ответ выглядит актуальным, но он говорит об исправленной ошибке и очень стар.
auto pd1 = std::make_unique<data_t>()
. - person kfsone   schedule 25.06.2016