Код: Выделить всё
template
struct X
{
T v_;
// Add conversion constructor here
};
Код: Выделить всё
// g++ -Wall -Werror -Werror=narrowing ./2.cpp
#include
#include
template
void test(X) {}
int main()
{
test(1);
test("1");
}
[dcl.init.list]
{7} Сужающее преобразование — это неявное преобразование
7.3) из целочисленного типа или типа перечисления с незаданной областью в тип тип с плавающей запятой, кроме, где источником является постоянное выражение, а фактическое значение после преобразования будет соответствовать целевому типу и будет создавать исходное значение при преобразовании обратно в исходный тип, или
В случае, если я определяю конструктор преобразования следующим образом:
Код: Выделить всё
X(T v) : v_(v) {}
Код: Выделить всё
./2.cpp:26:32: error: could not convert ‘(const char*)"1"’ from ‘const char*’ to ‘X’
26 | test("1");
Код: Выделить всё
template
X(Other const& 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} {}
| ^~~~~
- Вывод шаблонов и неявные конструкторы: есть ли способ заставить вывод шаблонов работать с неявным преобразованием?
- Как использовать функцию шаблона для неявного преобразования
- Сужение преобразования от char к double
- Один для случая, когда T является типом с плавающей запятой
- Другой для остальных случаев.
Другой вариант — объявить один конструктор и включить его, Enable_if_t, если OtherT можно преобразовать в T без потери данных. Мне просто нужно использовать такую функцию:
Код: Выделить всё
template>
X(Other const& v) : v_(static_cast(v)) {}
Есть ли другие варианты?
Подробнее здесь: https://stackoverflow.com/questions/798 ... version-wa
Мобильная версия