2012-03-30 28 views
8

Tôi chỉ thấy rằng C++ không đưa ra bất kỳ cảnh báo nào để truyền từ pair<double, int> đến pair<int, int>, điều này hơi đáng ngạc nhiên. Đây là chương trình của tôi test_pair.cpp:g ++ cho ghép cặp?

#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);               
} 

tôi biên dịch nó bằng cách sử g++ test_type.cpp -Wall -Wconversion, nhưng vẫn không có cảnh báo được tạo ra. Tôi đang sử dụng g ++ v4.6.1. Bất cứ ai có bất kỳ ý tưởng làm thế nào để làm cho g + + tạo ra một cảnh báo cho điều này, hoặc nó chỉ có thể không được thực hiện?

+1

ký hiệu này là gì? Tôi không quen với nó: 'v.push_back ({p});'. – orlp

+0

xin lỗi, tôi đã cố gắng sử dụng C++ 11 tính năng, tôi nên loại bỏ các dấu ngoặc. – chtlp

Trả lời

4

Các cặp (và bộ) được cấu hình từ hầu hết mọi thứ phù hợp. Đặc biệt, mỗi phần tử có thể được xây dựng từ bất kỳ thứ gì có thể chuyển đổi hoàn toàn thành phần tử đó. Về cơ bản, nó "làm những gì bạn mong đợi". Các pair có mẫu nhà xây dựng mà giống như thế này:

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

Tuy nhiên, bạn chỉ nên nói:

v.emplace_back(3.8, 3); 
+2

+1, nhưng có một nitpick, chúng có thể được xây dựng từ bất cứ thứ gì * ẩn chứa * chuyển đổi, không chỉ chuyển đổi được. Đó là từ ngữ tiêu chuẩn trong một thời gian dài (C++ 03, không chắc chắn về C++ 98), mặc dù với C++ 03 hạn chế không thể được thực thi. –

+1

v.emplace_back (3.8, 3) vẫn không tạo ra bất kỳ cảnh báo nào. Nhưng cảm ơn vì lời giải thích. Tôi nghĩ rằng tính năng đúc tiềm ẩn này có thể hơi khó hiểu. – chtlp

+1

Các contructor có liên quan cho các ví dụ trong câu hỏi thực sự là 'mẫu cặp (const cặp & p);' – leftaroundabout

Các vấn đề liên quan