提供带有const参数的函数指针作为带有nonconst参数的函数指针是否安全?

时间:2018-03-15 11:52:44

标签: c++ arduino

我已在this中读到,在C中它必须是安全的(基于答案)

我想知道在C ++中做同样的事情是否安全(根据this中的答案,它应该是)。我附上了我编写的代码,以准确显示我想要问的内容。

我有一个函数指针作为参数。参数是一个带有非参数参数的函数指针,但我为该函数提供了一个带有const参数的函数的指针。

海湾合作委员会没有抱怨它,我认为它应该是安全的,但我想确保我不留下任何细节。

typedef uint16_t (myFunction)(uint16_t);

uint16_t increment(const uint16_t input);
uint16_t callFunction(myFunction* function, const uint16_t input);



uint16_t increment(const uint16_t input)
{
    return input + 1;
}


uint16_t callFunction(myFunction* function, const uint16_t input)
{
    return (*function)(input);
}

void setup()
{
    callFunction(increment, 2);
  /* add setup code here */

}

void loop()
{

  /* add main program code here */

}

1 个答案:

答案 0 :(得分:0)

阅读ÖöTiib的评论后。我决定回答一些细节,以便我可以回答这个问题而不是浪费其他用户的时间。

基于工作草案,编程语言C ++标准(N4727),第16.1节“可重载声明”

  

3.4仅存在或不存在const和/或volatile的参数声明是等效的。也就是说,const和   当时,将忽略每个参数类型的volatile类型说明符   确定正在声明,定义或调用哪个函数。

     

typedef const int cInt;

     

int f (int);

     

int f (const int); // redeclaration of f(int)

     

int f (int) { /* ... */ } // definition of f(int)

     

int f (cInt) { /* ... */ } // error: redefinition of f(int)

     

只有最外层的const和volatile类型说明符   以这种方式忽略参数类型规范;常量   和volatile类型说明符隐藏在参数类型中   规范是重要的,可用于区分   重载函数声明。特别是对于任何类型的T,   “指向T的指针”,“指向const T的指针”和“指向易失性T的指针”   被认为是不同的参数类型,如“对T的引用”,   “引用const T”和“引用volatile T”。

根据上述说明,可以得出结论,一定不能有任何问题。