Почему я не могу сделать decltype для оператора извлечения

Кажется, это должно быть законно:

decltype(declval<istream>().operator>>(declval<istream>(), declval<int>())) test;

Но когда я пытаюсь скомпилировать, я получаю:

ошибка C2661: std::basic_istream<char,std::char_traits<char>>::operator >>: никакая перегруженная функция не принимает 2 аргумента

Я делаю что-то неправильно? Почему это не оценивает istream?

РЕДАКТИРОВАТЬ:

Это было указано это потому что istream& istream::operator>>(int&) является методом, первое значение передается автоматически.

Тем не мение: decltype(declval<istream>().operator>>(declval<int>())) test; ошибки с:

ошибка C2664: std::basic_istream<char,std::char_traits<char>> &std::basic_istream<char,std::char_traits<char>>::operator >>(std::basic_streambuf<char,std::char_traits<char>> *): невозможно преобразовать аргумент 1 из std::ios_base::iostate в std::basic_istream<char,std::char_traits<char>> &(__cdecl *)(std::basic_istream<char,std::char_traits<char>> &)

А также decltype(istream::operator >> (declval<istream>(), declval<int>())) test; ошибки с:

ошибка C2661: std::basic_istream<char,std::char_traits<char>>::operator >>: никакая перегруженная функция не принимает 2 аргумента

2

Решение

operator>> это занимает int является функцией-членом (в настоящее время вы используете синтаксис для обоих членов а также функции, не являющиеся членами), и он принимает аргумент по ссылке (чтобы он мог заполнить его — declval<int>() дает вам int&&, тебе нужно declval<int&>() чтобы получить int&):

using T = decltype(declval<istream>().operator>>(declval<int&>()));

Еще лучше не вызывать оператора напрямую, поэтому вам не нужно беспокоиться о том, какой operator<< является членом и который не является:

using T = decltype(declval<istream&>() >> declval<int&>());
7

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

Других решений пока нет …

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