Вывод типа возврата с закрытой переменной-членом

Как было объяснено в этом Q&Вчера, и g ++ 4.8, и Clang 3.3 правильно жалуются на приведенный ниже код с ошибкой типа «b_ не был объявлен в этой области»

#include <iostream>

class Test
{
public:
Test(): b_(0) {}

auto foo() const -> decltype(b_) // just leave out the -> decltype(b_) works with c++1y
{
return b_;
}
private:
int b_;
};

int main()
{
Test t;
std::cout << t.foo();
}

Перемещение private раздел к началу определения класса устраняет ошибку и печатает 0.

Мой вопрос Эта ошибка также исчезнет в C ++ 14 с вычетом возвращаемого типа, так что я могу опустить decltype и мой private раздел в конце определения класса?

НОТА: Это на самом деле работает основываясь на ответе @JesseGood.

18

Решение

Нет, но в этом больше нет необходимости, потому что вы можете сказать,

decltype(auto) foo() const {
return b_;
}

Это автоматически выведет тип возвращаемого значения из его тела.

22

Другие решения

Я так не думаю, потому что C ++ 14 будет автоматически выводить тип возврата. Следующее компилируется с g ++ 4.8, передавая -std=c++1y флаг.

auto foo() const
{
return b_;
}
5