2012-03-30 62 views
8

我刚刚发现C++没有给出从pair<double, int>pair<int, int>的投射警告,这有点令人惊讶。下面是我的程序test_pair.cpp铸造对的g ++警告选项?

#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

这是什么符号?我不熟悉它:'v.push_back({p});'。 – orlp 2012-03-30 11:51:19

+0

对不起,我试图使用C++ 11功能,我应该删除括号。 – chtlp 2012-03-30 11:52:05

回答

4

对(和元组)可以从几乎任何适合的东西中构造出来。特别是,每个元素都可以由任何可以隐式转换的元素构建。基本上,它“符合你的期望”。该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); 
+2

+1,但有一个挑剔的问题,它们可以由任何隐含*可转换的东西构成,而不仅仅是可转换的。这已经是很长一段时间的标准措辞(C++ 03,不确定C++ 98),即使使用C++ 03,限制也无法实现。 – 2012-03-30 11:56:33

+1

v.emplace_back(3.8,3)仍不会产生任何警告。但谢谢你的解释。我认为这种隐含的转换特性可能有点令人困惑。 – chtlp 2012-03-30 12:01:14

+1

这个例子的相关构造函数实际上是'template pair(const对 & p);' – leftaroundabout 2012-03-30 12:01:57