Конечный тип возврата и значения

Я читаю Скотта Мейерса Эффективный Современный C ++ и я пытаюсь на моей машине пример, который он предоставляет для Типы вывода глава.

Он обеспечивает эту функцию:

template <typename Container, typename Index>
auto decltype_test_1(Container& c, Index i) -> decltype(c[i])
{
return c[i];
}

И тогда он использует функцию следующим образом:

std::deque<int> d;
…
decltype_test_1(d, 5) = 10; // authenticate user, return d[5],
// then assign 10 to it;
// this won't compile!

Сказать, что это не скомпилируется. Я пытался с MSVC, и он компилируется. Я написал следующее в main:

std::deque<int> d;
d.push_back(0);
d.push_back(1);
d.push_back(2);

decltype_test_1(d, 0) = 10;

for each (auto item in d)
cout << item << endl;

Я не понимаю, почему это компилируется, и, прежде всего, это показывает 10 в качестве первого элемента deque. Для того, что он объясняет, этот код неверен. Почему это работает здесь? Что мне не хватает?

2

Решение

Этот комментарий не о примере C ++ 11 с конечным типом decltype, а о версии C ++ 14 с auto тип вычета:

template <typename Container, typename Index>
auto decltype_test_1(Container& c, Index i) //no trailing return
{
return c[i];
}

Используя эту версию, пример не будет скомпилирован, потому что тип будет выведен как значение, а не как ссылка, поэтому вы не можете напрямую присвоить результат вызова функции.

Как указано на следующей странице книги, способ получения правильного типа без конечного типа возврата заключается в использовании decltype(auto) вместо auto,

template <typename Container, typename Index>
decltype(auto) decltype_test_1(Container& c, Index i)
{
return c[i];
}
6

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


По вопросам рекламы [email protected]