Bitfeld in Überladungsauflösung für Vorlage

Weiß jemand, warum das erste Programm kompiliert wird, das zweite jedoch nicht? Der einzige Unterschied besteht darin, dass die erste Funktion die normale Funktion verwendet, die zweite jedoch die Vorlagenfunktion. Warum verhält sich die Überladungsauflösung bei Bitfeldern für Vorlagen- und Nicht-Vorlagenfunktionen unterschiedlich?

Bitte beachten Sie bei der Beantwortung die Absätze in der Norm. Vielen Dank.

a.cpp

struct X {
  int x : 20;
  int y : 12;
};

void f(const int& x) {}

void f(int&& x) {}

int main() {
  X x;
  f(x.x);
}

b.cpp

struct X {
  int x : 20;
  int y : 12;
};

template <typename T>
void f(T&& x) {}

template <typename T>
void f(const T& x) {}

int main() {
  X x;
  f(x.x);
}

Compiler-Fehler:

[hidden]$ g++ -v 2>&1 | tail -n 1
gcc version 4.7.2 20120921 (Red Hat 4.7.2-2) (GCC)
[hidden]$ clang++ -v 2>&1 | head -n 1
clang version 3.3
[hidden]$ g++ -std=c++11 a.cpp
[hidden]$ g++ -std=c++11 b.cpp
b.cpp: In function ‘int main()’:
b.cpp:14:8: error: cannot bind bitfield ‘x.X::x’ to ‘int&’
[hidden]$ clang++ -std=c++11 a.cpp
[hidden]$ clang++ -std=c++11 b.cpp
b.cpp:14:5: error: non-const reference cannot bind to bit-field 'x'
  f(x.x);
    ^~~
b.cpp:2:7: note: bit-field is declared here
  int x : 20;
      ^
1 error generated.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage