【问题标题】:Is it safe to provide a function pointer with a const argument as a function pointer with a nonconst argument?将带有 const 参数的函数指针作为带有非常量参数的函数指针提供是否安全?
【发布时间】:2018-08-24 05:22:20
【问题描述】:

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

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

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

GCC 没有抱怨它,我认为它应该是安全的,但我想确保我没有留下任何细节。

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 */

}

【问题讨论】:

  • 在 C++ 中也是一样,最上面的 const volatile 限定符只影响函数体内参数的可变性。
  • 我意识到你上面说的是正确的,但如果参数是“const int&”和“int&”,那么编译器会抱怨。如果我将引用视为指针,我可以理解为什么它不起作用,因为 const 指的是指针指向的内容,而不是指针本身。您能否验证我的理解,以便我可以将其添加到我的答案中,谢谢。
  • int& 中最重要的东西是引用,它本质上是不可变的,因此不能是易变的。

标签: c++ arduino


【解决方案1】:

阅读 Öö 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 的指针”和“指向 volatile T 的指针”是 被视为不同的参数类型,如“对 T 的引用”, “引用 const T”和“引用 volatile T”。

根据上面的描述,断定应该没有问题。

【讨论】:

    猜你喜欢
    • 2012-01-04
    • 2021-12-08
    • 1970-01-01
    • 2018-08-25
    • 2018-09-02
    • 2018-01-03
    • 1970-01-01
    • 2020-04-14
    • 2019-09-16
    相关资源
    最近更新 更多