$9.4.5
7 Сужающее преобразование — это неявное преобразование
(7.3) из целочисленного типа или перечисляемого типа с незаданной областью действия в тип с плавающей запятой, за исключением случаев, когда источником является постоянное выражение и фактическое значение. после преобразования будет соответствовать целевому типу и будет возвращать исходное значение при обратном преобразовании в исходный тип.
Таким образом, вы можете написать такой код:
Код: Выделить всё
double x = 1;
Код: Выделить всё
// g++ -Wall -Werror -Werror=narrowing ./2.cpp
#include
#include
template
struct X
{
T v_;
// ./2.cpp:26:32: error: could not convert ‘(const char*)"1"’ from ‘const char*’ to ‘X’
// 26 | test("1");
// X(T v) : v_(v) {}
// ./2.cpp:17:23: error: narrowing conversion of ‘(int)v’ from ‘int’ to ‘double’ [-Werror=narrowing]
// 17 | X(Other const& v) : v_{v} {}
// | ^~~~~
// template
// X(Other const& v) : v_{v} {}
};
template
void test(X) {}
int main()
{
test(1);
test("1");
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... onversions
Мобильная версия