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.