为什么在自动和模板功能情况下都不能将类型推导出为const类型?

时间:2019-02-11 19:33:49

标签: c++ templates type-deduction

这是我在这里的第一个问题,我希望我已经添加了所有相关信息,以便拥有一个最少的可验证的完整程序。如果您需要更多信息,请给我评论。

我正在学习C ++模板编程和类型推导。

  • 情况I :我使用auto关键字作为类型,并将整数转换为const double
  • 案例II :我使用了模板函数(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推导类型相同?

1 个答案:

答案 0 :(得分:2)

这听起来有些奇怪,但是const仅适用于变量(和其他事物),而不适用于常量,因为常量已经总是const

在您的代码中:

auto t = static_cast<const double>(1);

t将获得类型double,这将说明您看到的行为。

  

我要做什么才能使推断出的类型与static_casted类型相同?

const doubledouble作为实际参数传递给函数时,您无法区分它们。从调用者的角度来看,两者都是按值传递的,并且都是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在太多上下文中用于太多目的。可能会造成混淆。