Рассмотрим следующий код:
template <typename T>
class B
{
};
template <typename T>
B<T> f(T& t)
{
return B<T>();
}
class A
{
class C {};
C c;
public:
A() {}
decltype(f(c)) get_c() const { return f(c); }
};
int main()
{
A a;
a.get_c();
}
Когда я пытаюсь это скомпилировать, я получаю сообщение об ошибке:
test.cpp: In member function 'B<A::C> A::get_c() const':
test.cpp:31:46: error: conversion from 'B<const A::C>' to non-scalar type 'B<A::C>' requested
Похоже, что в decltype компилятор не знает, что это константная функция-член, и поэтому c
имеет тип const C
, и в результате неправильно выводит тип f(c)
как 1010 *, а не B<const C>
, который действительно есть.
Я что-то делаю неправильно, или это ошибка компилятора? Я использую gcc 4.6, но 4.4 и 4.5 показывают то же поведение.