C ++中的模板参数

巴万

我正在阅读模板基础知识,以及如何使用模板将参数传递给函数。我尝试了以下程序,并且运行正常,没有任何编译错误。该函数修改传递给它的值,但rxcx是常数,它们不能被修改。因此,编译器应引发编译错误。

输出即将到来:

Param before : 27
Param after : 23
Param before : 27
Param after : 23
Param before : 27
Param after : 23

以下是完整的代码:

#include <iostream>

using namespace std;

template<typename T>
//void f(const T& param) // param is now a ref-to-const
void f(T param) 
{
  cout << "Param before : "  <<  param << endl;
  param = 23;
  cout << "Param after : "  <<  param << endl;
}

int main(int argc, char *argv[])
{
  int x = 27;
  const int cx = x;
  const int& rx = x; // as before

  // as before
  // // as before

  f(x); // T is int, param's type is const int&
  f(cx); // T is int, param's type is const int&
  f(rx); // T is int, param's type is const int&
  return 0;
}
Kaho Ply

当将函数参数定义为按值传递时,如param在函数模板中那样f

template<typename T>
void f(T param) // <-- note T, and not T&

型衰减发生,并且作为结果的const限定符被丢弃。这种“取消资格”是有道理的,因为实际上是一个副本,什么被传递给函数,并没有原来的对象(如:原来的对象可能是const,但它的拷贝没有到)。


该函数修改传递给它的值,但rxcx是常数,它们不能被修改。

由于上述类型的衰变,在您的三种情况下T被推论为int(即:不合格)。该函数实际上是在修改const要传递的对象的非副本。因此,您看不到任何编译错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在C ++中更改模板模板参数

来自分类Dev

C ++中函数类型的模板参数

来自分类Dev

C ++中的模板化参数推导

来自分类Dev

在C ++中确定模板参数的类型

来自分类Dev

C ++ 11模板中的默认位置参数

来自分类Dev

模板参数在c ++中存储在哪里?

来自分类Dev

C ++中的模板参考参数推导失败

来自分类Dev

消除C ++中的冗余模板参数

来自分类Dev

C ++ 14中的模板化函数参数

来自分类Dev

减少C ++中的模板化类参数

来自分类Dev

在C ++ 11中枚举布尔模板参数

来自分类Dev

在模板方法C ++中传递struct参数

来自分类Dev

减少 C++ 中模板参数的重复

来自分类Dev

指针作为C ++中的模板参数

来自分类Dev

C ++中带有模板的默认参数

来自分类Dev

没有完全指定模板作为C ++中的模板参数

来自分类Dev

模板构造函数中的 C++ 模板参数

来自分类Dev

用C ++中的附加模板参数扩展模板化结构

来自分类Dev

C ++-使用没有模板参数的模板类中的枚举

来自分类Dev

在 C++ 中获取模板类型的“嵌套”模板参数的数量

来自分类Dev

从C ++中的模板类继承,以enum作为模板参数

来自分类Dev

C++ 在模板的参数中传递模板的构造函数值

来自分类Dev

模板参数的C ++模板参数

来自分类Dev

如何在C ++中存储可变参数模板参数?

来自分类Dev

C++ 可变参数函数中的模板参数推导错误

来自分类Dev

C ++模板参数包会自动在其参数中添加&

来自分类Dev

C ++中没有参数可变参数模板函数

来自分类Dev

在C ++中的其他类中设置模板参数

来自分类Dev

覆盖C ++中的孙类中的模板参数?