Как заставить этот код работать? (Сужение преобразований, преобразование типов) [дубликат]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как заставить этот код работать? (Сужение преобразований, преобразование типов) [дубликат]

Сообщение Anonymous »

Согласно стандарту C++ в некоторых случаях преобразование из int в double не считается сужающим преобразованием:

$9.4.5
7 Сужающее преобразование — это неявное преобразование
(7.3) из целочисленного типа или перечисляемого типа с незаданной областью действия в тип с плавающей запятой, за исключением случаев, когда источником является постоянное выражение и фактическое значение. после преобразования будет соответствовать целевому типу и будет возвращать исходное значение при обратном преобразовании в исходный тип.

Таким образом, вы можете написать такой код:

Код: Выделить всё

double x = 1;
Я хотел бы создать класс, аналогичный std::variant, для хранения значения аргумента функции. Проблема в том, что я не могу это сделать, чтобы он компилировался без предупреждений и ошибок:

Код: Выделить всё

// 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");
}
В X(Other) я намеренно использую фигурные скобки, чтобы выявить сужающие преобразования, но это не работает должным образом. Есть ли другой способ достичь цели?


Подробнее здесь: https://stackoverflow.com/questions/798 ... onversions
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»