Я наткнулся на удивительное поведение нового конструктора std::pair
, который был введен с С++ 11. Я заметил проблему при использовании std::pair<int, std::atomic<int>>
, и это происходит, потому что std::atomic
не является ни возможностью копирования, ни перемещением. В следующем коде я заменяю std::atomic<int>
на foobar
для упрощения.
Следующий код компилируется отлично, как с GCC-4.9, так и с Clang-3.5 (с libС++ и без него):
struct foobar
{
foobar(int) { } // implicit conversion
// foobar(const foobar&) = delete;
};
std::pair<int, foobar> p{1, 2};
Ожидается такое поведение. Однако, когда я удаляю конструктор копирования foobar
, компиляция не выполняется. Он работает с кусочной конструкцией, но я думаю, что это не обязательно, из-за неявного преобразования от int
до foobar
. Я имею в виду конструктор со следующей сигнатурой:
template <typename U, typename V>
pair(U&& u, V&& v);
Можете ли вы объяснить, почему конструктор пары является настолько ограничительным и не допускает неявных преобразований для noncopyable/nonmovable типов?