g ++ варианты предупреждений для литья пары? - PullRequest
8 голосов
/ 30 марта 2012

Я только что обнаружил, что C ++ не дает никаких предупреждений для приведения от pair<double, int> к pair<int, int>, что немного удивляет. Вот моя программа test_pair.cpp:

#include <vector>
#include <utility>
using namespace std;


int main()
{
    std::vector<pair<int, int> > v;
    pair<double, int> p = make_pair(3.8, 3);
    v.push_back(p);                                                           
}

Я скомпилировал его, используя g++ test_type.cpp -Wall -Wconversion, но предупреждения пока не генерируются. Я использую g ++ v4.6.1. У кого-нибудь есть идеи, как заставить g ++ генерировать предупреждение для этого, или это просто невозможно сделать?

1 Ответ

4 голосов
/ 30 марта 2012

Пары (и кортежи) могут быть построены практически из всего, что подходит.В частности, каждый элемент может быть построен из всего, что неявно преобразуется в него.По сути, он «делает то, что вы ожидаете».У pair есть шаблоны конструктора, которые выглядят примерно так:

template <typename U, typename V>
pair(U && u, V && v) : first(std::forward<U>(u)), second(std::forward<V>(v))
{ }

Однако вы должны просто сказать:

v.emplace_back(3.8, 3);
...