Invalid explizit angegebenes Argument in clang, aber erfolgreiche Kompilierung in gcc - wer irrt sich?

Der folgende Code wird ohne Probleme in g ++ kompiliert:

#include <iostream>
#include <string>
#include <tuple>

template<typename T>
void test(const T& value)
{
    std::tuple<int, double> x;
    std::cout << std::get<value>(x);
}

int main() {
    test(std::integral_constant<std::size_t,1>());
}

Ich habe diesen Befehl benutzt:

g++ test.cpp -o test -std=c++14 -pedantic -Wall -Wextra

Aber wenn ich @ wechsg++ zuclang++ (mit g ++ 5.1.0 und clang ++ 3.6.0) erhalte ich folgende Fehlermeldungen:

test.cpp:9:18: error: no matching function for call to 'get'
    std::cout << std::get<value>(x);
                 ^~~~~~~~~~~~~~~
test.cpp:13:5: note: in instantiation of function template specialization 'test<std::integral_constant<unsigned long, 1> >' requested here
    test(std::integral_constant<std::size_t,1>());
         ^~~~~~~~~~~~~~~
<skipped>

/usr/bin/../lib/gcc/x86_64-linux-gnu/5.1.0/../../../../include/c++/5.1.0/tuple:867:5: note: candidate template ignored: invalid explicitly-specified argument for template parameter '_Tp'
    get(tuple<_Types...>& __t) noexcept
    ^

Und ähnlichenote: Einträge für andere Überladungen vonstd::get.

Aber ich gehe vorbeistd::integral_constant zutest(), was ein konstanter Ausdruck ist, warum sollte es ein "ungültiges explizit angegebenes Argument" für den Template-Parameter sein? Ist es ein Clang-Bug oder mache ich hier etwas falsch?

Ich habe bemerkt, dass, wenn ich Parameter für @ ändetest() vonconst T& zuconst T, dann wird Clang erfolgreich kompiliert. Verliere ich irgendwieconstexpr Qualität vonintegral_constant indem Sie es als Referenz übergeben?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage