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 = ∑ // const function
sum_func* sum_func_ptr = ∑ // 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)
| 归档时间: |
|
| 查看次数: |
3484 次 |
| 最近记录: |