Bonjour,

Voici un code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
 
template<typename T>
class Wrapper {
public:
	Wrapper(T value) :
			raw_data(value) {
	}
 
	explicit operator T() const {
		return raw_data;
	}
 
	friend const Wrapper operator *(const Wrapper& multiplier, const Wrapper& multiplicand) {
		T raw_result = multiplier.raw_data * multiplicand.raw_data;
		return Wrapper(raw_result);
	}
 
private:
	T raw_data;
};
 
using MyWrapper = Wrapper<int>;
 
template<typename U>
int multiply_then_convert(U value) {
	U multiplied = 2 * value;
	int converted = multiplied; // WTF? explicit?
	return converted;
}
 
int main() {
	{
		// Avec fonction template
		MyWrapper value = 25;
		int converted = multiply_then_convert(value);
	}
 
	{
		// Equivalent
		MyWrapper value = 25;
		MyWrapper multiplied = 2 * value;
		int converted = multiplied;
	}
}
La ligne 43 ne compile pas. C'est normal, l'opérateur de conversion est explicite, il faut donc faire un cast.

La ligne 28 fait la même chose. L'instanciation de cette fonction template pour un tel U (= Wrapper<int>) ne devrait donc pas compiler. Or, la ligne 36 passe comme une lettre à la Poste. L'exécution produit le résultat attendu (50).

Pourquoi ?

Merci d'avance pour vos réponses !