【问题标题】:Why the type did not deduced to `const` type in both auto and template function cases? [duplicate]为什么类型在自动和模板函数情况下都没有推导出为 `const` 类型? [复制]
【发布时间】:2019-02-11 19:33:49
【问题描述】:

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

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

  • case I:我使用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_casted 类型相同?

【问题讨论】:

  • 骗子没有明确说明你第二个问题要做什么,也就是说,你只需添加constauto t -> const auto t(T t) -> (const T t)
  • @NathanOliver 这意味着,连同static_cast&lt;const double&gt;,我需要按照你说的去做,对吧?
  • 而不是(const T t),它总是 const,更喜欢(T&amp;&amp; t),它与调用者完美匹配。
  • @Using 那种。您真的不需要 static_cast&lt;const double&gt;(1) 来购买汽车外壳。 const auto = 1; 会给你你想要的。

标签: c++ templates type-deduction


【解决方案1】:

这听起来可能很奇怪,但const 仅适用于变量(和其他东西),而不适用于常量,因为常量已经总是const

在您的代码中:

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

t 将获得 double 类型,这解释了您看到的行为。

我需要做什么,才能使推导的类型与 static_casted 类型相同?

const doubledouble 作为实际参数传递给函数时,您无法区分。从调用者的角度来看,两者都是按值传递的,并且都是 100% const(也没有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 在太多的上下文中用于太多的目的。这可能会令人困惑。

【讨论】:

    猜你喜欢
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 2018-07-11
    • 2021-04-06
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多