Оператор decltype при использовании с type* возвращает type&. есть ли способ получить только type.
int* i;
decltype(*i) l; // int& l;
int o; // decltype(???) o;
Я просто хотел знать, есть ли способ сделать это, нужна ли мне библиотека или что-то в этом роде?
редактировать:
Изначально я не хотел использовать какие-либо библиотеки, но я бы сделал это, если бы мне пришлось, и я пытался найти другие вопросы, чтобы решить проблему, но не нашел ни одного, который помог бы. Мне жаль, что я не упомянул об этом должным образом.





Вы можете использовать std::remove_reference, например:
#include <type_traits>
int* i;
decltype(*i) l; // int& l;
std::remove_reference<decltype(l)>::type o; // int o;
// or, in C++14 and later:
std::remove_reference_t<decltype(l)> o; // int o;
Использование decltype — это не просто выражение идентификатора в операторе, поэтому применяются обычные правила decltype:
decltype применяется к lvalue, типом является T&. (Ваш случай)decltype применяется к значению x, типом является T&&.decltype применяется к значению prvalue, типом является T.См. также Что такое decltype и как он используется?
Как подойти к этой проблеме, зависит только от вас и зависит от конкретной ситуации. Вот несколько вариантов:
std::remove_pointer_t<decltype(i)>std::remove_reference_t<decltype(*i)>decltype(auto(*i)) (С++23)Простой способ — написать
#include <type_traits>
//...
std::decay_t<decltype( *i )> l;
Наблюдать:
#include <iostream>
#include <type_traits>
#include <boost/type_index.hpp>
template <typename T> void print()
{
std::cout << boost::typeindex::type_id_with_cvr<T>().pretty_name() << '\n';
}
int main()
{
int* i;
print<decltype(*i)>();
print<std::remove_reference_t<decltype(*i)>>();
print<std::remove_reference_t<decltype(i)>>(); // works, even if not a reference
}
stieber@gatekeeper:~ $ g++ Test.cpp && ./a.out
int&
int
int*
Я просто добавил последнюю строку, чтобы показать, что вы можете remove_reference использовать тип, который на самом деле не является ссылкой.
Отвечает ли это на ваш вопрос? Удалить ссылку в decltype (вернуть T вместо T&, где T& — это decltype)