这是我在这里的第一个问题,我希望我已经添加了所有相关信息,以便拥有一个最少的可验证的完整程序。如果您需要更多信息,请给我评论。
我正在学习C ++模板编程和类型推导。
auto
关键字作为类型,并将整数转换为const double
。 type_fun
),并告诉编译器按如下所示对const double
进行演绎:#include <iostream>
#include <type_traits>
template<typename T>
void type_fun(T t)
{
std::cout << "From type function: " << std::endl;
std::cout << std::boolalpha << std::is_same_v<const double, decltype(t)> << std::endl;
std::cout << std::boolalpha << std::is_same_v<double, decltype(t)> << std::endl;
}
int main()
{
auto t = static_cast<const double>(1);
std::cout << std::boolalpha << std::is_same_v<const double, decltype(t)> << std::endl;
std::cout << std::boolalpha << std::is_same_v<double, decltype(t)> << std::endl;
type_fun(static_cast<const double>(1));
}
但是,结果是相同的。程序说推断的类型是non-const double
。为什么编译器忽略了const
?
我要做什么才能使推导类型与static_cast
推导类型相同?
答案 0 :(得分:2)
这听起来有些奇怪,但是const
仅适用于变量(和其他事物),而不适用于常量,因为常量已经总是const
。
在您的代码中:
auto t = static_cast<const double>(1);
t
将获得类型double
,这将说明您看到的行为。
我要做什么才能使推断出的类型与static_casted类型相同?
将const double
和double
作为实际参数传递给函数时,您无法区分它们。从调用者的角度来看,两者都是按值传递的,并且都是100%常量(也没有const
)。该函数无法修改调用者的值。因此,编译器不进行任何区分。
如果您想在模板函数中打印const double
变体,则必须使其:
template<typename T>
void type_fun(const T t)
{
std::cout << "From type function: " << std::endl;
std::cout << std::boolalpha << std::is_same_v<const double, decltype(t)> << std::endl;
std::cout << std::boolalpha << std::is_same_v<double, decltype(t)> << std::endl;
}
但是无论传入的类型如何,此变体随后都会始终输出const double
变体。无论传入的类型是什么。在这种情况下,形式参数附近的const表示所传递的值在函数中不能更改按值(非const或const)。
const
在太多上下文中用于太多目的。可能会造成混淆。