Я читаю Скотта Мейерса Эффективный Современный 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. Для того, что он объясняет, этот код неверен. Почему это работает здесь? Что мне не хватает?
Этот комментарий не о примере 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];
}