指向const与通常指针的指针(用于函数)

Kir*_*sky 5 c++ function-pointers

指向const的指针和函数的常用指针之间有什么区别吗?什么时候使用const限定符适合独立函数?

我写了一些简短的样本来说明我的问题:

#include <iostream>
using namespace std;

int sum( int x, int y ) { return x + y; }
typedef int sum_func( int, int );

int main()
{
    const sum_func* sum_func_cptr = &sum; // const function
    sum_func* sum_func_ptr = &sum;        // non-const function ?

    // What is the difference between sum_func_cptr and sum_func_ptr

    int x = sum_func_cptr( 2, 2 );
    cout << x << endl;

    int y = sum_func_ptr( 2, 2 );
    cout << y << endl;

    sum_func_cptr = 0;
    sum_func_ptr = 0;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

g ++没有警告.这就是我问的原因.

Joh*_*itb 12

关于C++ 03,你的代码格式不正确.您不能构造const(或volatile)限定的函数类型.无论何时,你的程序都会变得格格不入.

此规则针对C++ 1x进行了更改,以使编译器忽略const/ volatile.即使在C++ 03模式下,C++编译器通常也会实现此规则.因此,以下两个将定义相同的函数两次,并导致编译错误.

typedef void Ft();


void f(Ft const*) { }
void f(Ft *) { } // another definition!
Run Code Online (Sandbox Code Playgroud)

这是我的主张的证据.C++ 03,8.3.5/1

cv-qualifier-seq只能是非静态成员函数的函数类型的一部分,指向成员的指针引用的函数类型,或函数typedef声明的顶级函数类型.cv-qualifier-seq在函数声明符中的作用与在函数类型之上添加cv-qualification不同,即它不会创建cv限定的函数类型.实际上,如果在确定类型的任何时候形成了cv限定的函数类型,则该程序是不正确的.

这是C++ 1x,8.3.5/7n2914的文本:

cv-quali fi-seq只能是非静态成员函数的函数类型的一部分,指向成员的指针引用的函数类型,或函数typedef声明的顶级函数类型.函数声明符中cv-quali-erq-seq的效果与在函数类型之上添加cv-quali fi cation不同.在后一种情况下,cv-quali firs被忽略.

上面说下面的内容是有效的,并为可以声明const成员函数的函数创建函数类型.

typedef void Ft() const;
struct X { Ft cMemFn; };
void X::cMemFn() const { }
Run Code Online (Sandbox Code Playgroud)


Nav*_*een 6

根据定义,独立函数是常量.因此,const和非const函数指针之间没有区别.