// 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