Grüß euch
Ich hab ein komisches subtiles Problem mit variable templates und
decltype. Aber vielleicht zuerst etwas Vorgeschichte... Ich nutze
variable templates als Abkürzung um std::integral_constant Varianten für
verschiedene Built-In Types zu erzeugen.
Es gibt also zum Beispiel
1 | template<uint8_t I>
|
2 | constexpr auto uint8_c{std::integral_constant<uint8_t, I>{}};
|
(Falls das jemandem bekannt vorkommt, ja, die Bezeichnung ist von Hana
geklaut ;) )
Soweit so gut. Ich glaub wir sind uns alle einig dass folgendes gilt:
1 | std::integral_constant<uint8_t, 42> == uint8_c<42>
|
Der Compiler (GCC 7.3.0-1) scheint da mit mir einer Meinung zu sein,
is_same ergibt true und auch die Typenausgabe via boost-typeindex ist
ident.
Und jetzt wirds irgendwie... komisch.
1 | auto t = std::make_tuple(std::make_tuple(uint8_c<42>), 42);
|
2 | auto get_works = get<std::integral_constant<uint8_t, 42>>(t);
|
3 | auto get_doesnt_work = get<decltype(uint8_c<42>)>(t);
|
Während der erste Aufruf in meine eigene get-Funktion nämlich
compiliert, tut es der 2. nicht. Der schießt sich mit einer
static_assertion ab, dass der den Typen nicht findet.
Kennt jemanden einen Bug in Bezug auf decltype und variable templates?
Da hats doch was oder?
/edit
Achja, die error-msg behauptet auch es is ein
std:integral_constant<uint8_t, 42>...
1 | required from ‘constexpr decltype(auto) get(U&&) [with T = const std::integral_constant<unsigned char, 42>...
|
Ich versteh die Welt nimma. :)