Code: Select all
template
struct X
{
T v_;
// Add conversion constructor here
};
Code: Select all
// g++ -Wall -Werror -Werror=narrowing ./2.cpp
#include
#include
template
void test(X) {}
int main()
{
test(1);
test("1");
}
[dcl.init.list]
{7} Eine einschränkende Konvertierung ist eine implizite Konvertierung
7.3) von einem Ganzzahltyp oder einem Aufzählungstyp ohne Gültigkeitsbereich in einen Gleitkommatyp, außer, wenn die Quelle ein konstanter Ausdruck ist und der tatsächliche Wert nach der Konvertierung in den Zieltyp passt und den ursprünglichen Wert erzeugt, wenn er zurück in den ursprünglichen Typ konvertiert wird, oder
Falls ich den Konvertierungskonstruktor wie folgt definiere:
Code: Select all
X(T v) : v_(v) {}
ist
Code: Select all
./2.cpp:26:32: error: could not convert ‘(const char*)"1"’ from ‘const char*’ to ‘X’
26 | test("1");
Code: Select all
template
X(Other const& v) : v_{v} {}
Code: Select all
./2.cpp:17:23: error: narrowing conversion of ‘(int)v’ from ‘int’ to ‘double’ [-Werror=narrowing]
17 | X(Other const& v) : v_{v} {}
| ^~~~~
- Vorlagenabzug und implizite Konstruktoren: Gibt es eine Möglichkeit, den Vorlagenabzug mit impliziter Konvertierung zum Laufen zu bringen?
- Wie verwende ich die Vorlagenfunktion für die implizite Konvertierung?
- Eingrenzung der Konvertierung von char nach double
- Einer für den Fall, wenn T ein Gleitkommatyp ist
- Ein anderer für den Rest der Fälle.
Eine andere Option besteht darin, einen Konstruktor zu deklarieren und ihn zu aktivieren_if_t, wenn OtherT ohne Datenverlust in T konvertiert werden kann. Ich muss nur mit der Funktion such trait kommen:
Code: Select all
template>
X(Other const& v) : v_(static_cast(v)) {}
Gibt es andere Optionen?
Mobile version