// g++ sizeofint.cpp --std=c++11 -Wconversion -Wall -Wextra -Werror -pedantic-errors
#include <iostream>
#include <utility>
int main(int argc, char **argv) {
(void)argc;
(void)argv;
int a = 0x12345678;
std::cout << sizeof(int) << "..." << sizeof(uint16_t) << std::endl;
std::pair<uint16_t, uint16_t> p{a,a}; // !!!! no warning or error on conversion !!!!
std::cout << p.first << ":" << p.second << std::endl;
uint16_t b = a; // !!!! correct behavior: -Wconversion triggers warning, which -Werror turns to an error
std::cout << b << std::endl;
return 0;
}
ด้วยโค้ดด้านบน คุณจะเห็นการแปลงโดยนัยจาก int
เป็น uint16_t
ได้อย่างชัดเจนเมื่อสร้าง p
อย่างไรก็ตาม g++ ในเวอร์ชัน 4.9.1 ไม่ได้บ่นเกี่ยวกับการแปลงใดๆ เมื่อใช้พารามิเตอร์ที่ให้ไว้ในความคิดเห็นในตอนต้น
ต่อมา g++ จะบ่นเกี่ยวกับการแปลงโดยนัยเป็น uint16_t เมื่อสร้าง b
ฉันกำลังพยายามให้แน่ใจว่าการก่อสร้างของ p
จะส่งผลให้เกิดคำเตือนเป็นอย่างน้อย (แต่ควรมีข้อผิดพลาด)
มีความคิดอะไรบ้าง? มีการตั้งค่าสถานะที่ฉันไม่รู้ว่าจะกระตุ้นให้เกิดพฤติกรรมที่ถูกต้องหรือไม่
template<class U, class V> constexpr pair(U&& x, V&& y);
ของstd::pair
เนื่องจากการแปลงเกิดขึ้นจริงภายในตัวสร้างนั้น (ในส่วนหัวของระบบ) คุณจึงไม่ได้รับคำเตือน - person T.C.   schedule 27.08.2014