// 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;
}
Dengan kode di atas, Anda dapat melihat dengan jelas konversi implisit dari int
ke uint16_t
saat membuat p
. Namun, g++ pada versi 4.9.1 tidak mengeluhkan konversi apa pun saat menggunakan parameter yang disediakan dalam komentar di awal.
Kemudian, g++ mengeluh tentang konversi implisit ke uint16_t saat membuat b
.
Saya mencoba memastikan bahwa konstruksi p
akan menghasilkan setidaknya peringatan (tetapi sebaiknya kesalahan).
Ada pemikiran? Apakah ada tanda yang saya tidak tahu untuk memicu perilaku yang benar?
template<class U, class V> constexpr pair(U&& x, V&& y);
std::pair
. Karena konversi sebenarnya terjadi di dalam konstruktor tersebut (di header sistem), Anda tidak mendapat peringatan. - person T.C.   schedule 27.08.2014