2011-01-27 42 views
4

下面的代码没有警告编译GCC 4.2下,据我所知,这实在不应该:为什么__attribute __((纯))函数中的GCC强制参数为const?

#include <fstream> 

__attribute__((pure)) 
double UnpureFunction(double* x) { 
    x[0] = 42; 
    return 43; 
} 

int main() { 
    double x[] = {0}; 
    double y = UnpureFunction(x); 
    printf("%.2f %.2f\n", x[0], y); 
} 

(它打印出“42.00 43.00”。)

据我了解纯属性告诉编译器该函数没有外部影响(参见“纯”here部分)。但UnpureFunction正在修改其参数。为什么会发生这种情况?编译器至少可以自动使每个参数都为常量。

回答

10

据我所知,pure你的承诺编译器,但它不会尝试和验证你不撒谎。 即使它确实强制参数为const,这些参数也可能在说谎(例如,对象可能有一个在您的代码调用成员函数时会被修改的可变成员)。

如果您正在寻找const正确性,请使用const参数。 pureconst属性可以提供可用于优化的提示。

-2

啊,哑巴的问题。 __attribute __((pure))结构允许程序员将标准指针用作输出变量。我想这意味着我无法在我的变量前避免大量的样板常量。

1

首先,如果该函数正在转发其参数的const/non-const,那么该函数仍然可以是纯的,并且稍后的函数将对其进行修改。那就是非const引用并不表示函数会专门修改它,而是一个非const引用赋予访问权限,链中的某些操作将修改状态(即产生副作用)。例如,如果我想要写返回整数的向量的第一元素的功能:

int& first(std::vector<int>& v) __attribute__((pure)) 
{ 
    return *(v.begin()); 
} 

我可以声明,即使它可能需要一个非const引用它作为纯的,因为first()不修改矢量。相反,它只是检索第一个元素(通常不会产生副作用)。稍后的某些操作可能会修改该值。在这个意义上,它只是转发范围的const/non-const。

其次,即使参数const,但仍不能保证没有副作用,因为class也可以使用关键词mutable声明领域的修改,即使类是const

相关问题