Я пытался играть по стандарту C ++ 17. Я пытался использовать одну из функций C ++ 17 if constexpr
. И у меня возникла проблема ... Пожалуйста, посмотрите на следующий код. Это компилируется без ошибок. В следующем коде я попытался использовать if constexpr
, чтобы проверить, является ли это указателем.
#include <iostream>
#include <type_traits>
template <typename T>
void print(T value)
{
if constexpr (std::is_pointer_v<decltype(value)>)
std::cout << "Ptr to " << *value << std::endl; // Ok
else
std::cout << "Ref to " << value << std::endl;
}
int main()
{
auto n = 1000;
print(n);
print(&n);
}
Но когда я переписываю приведенный выше код, как показано ниже, где if constexpr
находится в функции main
:
#include <iostream>
#include <type_traits>
int main()
{
auto value = 100;
if constexpr (std::is_pointer_v<decltype(value)>)
std::cout << "Ptr to " << *value << std::endl; // Error
else
std::cout << "Ref to " << value << std::endl;
}
Я получаю ошибку компиляции:
main.cpp:8:32: error: invalid type argument of unary ‘*’ (have ‘int’)
std::cout << "Ptr to " << *value << std::endl;
Проблема не в основной функции. Это может быть любая функция, подобная следующей.
void print()
{
auto value = 100;
if constexpr (std::is_pointer_v<decltype(value)>)
std::cout << "Ptr to " << *value << std::endl; // Error
else
std::cout << "Ref to " << value << std::endl;
}
int main()
{
print();
}
Я хотел бы знать, почему if constexpr
работает только в шаблонных функциях, даже если тип определяется типом decltype из входного параметра.