Это уменьшенная часть Указателя на код реализации:г ++ 4.9.2 регрессии по ссылке перейти к «это»
template<typename T>
class PImpl {
private:
T* m;
public:
template<typename A1>
PImpl(A1& a1) : m(new T(a1)) {
}
};
struct A{
struct AImpl;
PImpl<AImpl> me;
A();
};
struct A::AImpl{
const A* ppub;
AImpl(const A* ppub)
:ppub(ppub){}
};
A::A():me(this){}
A a;
int main (int, char**){
return 0;
}
Он компилируется на G ++ 4.8 и до и работы, а также. Но компилятор G ++ 4.9.2 вызывает следующие ошибки:
prog.cpp: In constructor 'A::A()':
prog.cpp:24:15: error: no matching function for call to 'PImpl<A::AImpl>::PImpl(A*)'
A::A():me(this){}
^
prog.cpp:24:15: note: candidates are:
prog.cpp:9:5: note: PImpl<T>::PImpl(A1&) [with A1 = A*; T = A::AImpl]
> PImpl(A1& a1) : m(new T(a1)) {
^
prog.cpp:9:5: note: no known conversion for argument 1 from 'A*' to 'A*&'
prog.cpp:2:7: note: PImpl<A::AImpl>::PImpl(const PImpl<A::AImpl>&)
class PImpl {
^
prog.cpp:2:7: note: no known conversion for argument 1 from 'A*' to 'const PImpl<A::AImpl>&'
Но это может быть исправлено небольшим взломом. Если я передаю '& * этот' вместо 'этот', то он привозит к компилируемому состоянию.
Это регрессия G ++ или новая функция стандартов C++, которая устраняет обратную совместимость?
Он составлен на gcc-4.3.2: http://ideone.com/nKcI6m – slonma