Я наткнулся на этот фрагмент кода, включающий конечные типы возврата и наследование.
Следующий минимальный пример прекрасно компилируется с g++, а не с clang
struct Base {};
int foo(Base&) {
return 42;
}
struct Derived : public Base {
auto bar() -> decltype(foo(*this)) {
return foo(*this);
}
};
int main()
{
Derived derived;
derived.bar();
return 0;
}
Однако если мы изменим auto bar() → decltype(foo(*this))
на decltype(auto) bar()
(расширение С++ 14), код также будет компилироваться с помощью clang. Ссылка на Godbolt https://godbolt.org/z/qf_k6X.
Может кто-нибудь объяснить мне
- чем
auto bar() → decltype(return expression)
отличается отdecltype(auto) bar()
- почему поведение между компиляторами отличается
- что такое правильная реализация?