2012-04-24 60 views
1

下面的程序编译(使用gcc),但它应该吗?我会认为下面创建的V1(1.0)是一个常量,所以不能在其上调用非const方法。为什么可以在一个常量结构上调用一个非const成员函数?

class V{ 
    double v; 
public: 
    V(double v1){ v = v1;} 
    void clear(){ v = 0;} 
}; 

int main(){ 
    V(1.0).clear(); 
} 

比较这对一个函数“空隙F(INT &吨){}”,这不能被称为为“f(1)”,因为图1是一个常数,其不能成为一个非const的值参考t。

+2

临时!=常数(如你所发现的) – valdo 2012-04-24 11:41:51

+0

这里应该是一个常量结构? – leftaroundabout 2012-04-24 11:41:52

+1

我不清楚如何有什么东西可以是'const'。关键字不会出现在您的代码中的任何位置。此外,成员初始化语法。 – chris 2012-04-24 11:41:53

回答

1

你似乎混淆了常量与r值。 f(1)将是非法的,因为1不是l值。 V(1.0)不是一个常数,而是一个临时值。

+0

感谢所有的答复。 – Ekalavya 2012-04-24 12:36:52

+0

我假设临时表不应该显示为l值。 – Ekalavya 2012-04-24 12:51:15

3

V(1.0)调用构造函数,它通过复制初始化double v1。所以你有一个临时的文字副本。