65,186
社区成员




struct S
{
};
S Sfunc()
{
return S();
}
const int func()
{
return 5;
}
template <class T>
struct const_modified{
const static bool value=0;
};
tempalte <class T>
struct const_modified<const T>{
const static bool value=1;
};
int main()
{
const_modified<Sfunc()>::value;
const_modified<func()>::value
}
咱不提等号,我也没说是否和等号有关系,你来看这个程序:
int t;
int func()
{
return t;
}
func()=1;
func()现在返回的是右值的吧,为什么func()=1不可以了,而返回一个对象就可以呢?这是怎么回事?临时对象可以放在左边,而临时的内置变量不可以。[/quote]
因为自定义类型重载了operator =[/quote]
内置类型也有=运算符啊,并且可以轻松地进行赋值操作啊,没有什么问题啊,为什么不可以将一个值赋给一个临时的变量呢,而赋给一个非临时变量就可以呢?[/quote]
这是一个很好的质疑,C++在这里的处理逻辑并不连贯。对于内建类型,作为返回值的时候,相当于其前面加了个const限定符。这是一种特殊处理,与临时变量的左右值性没有太大关联。或者说内建类型的临时变量相当于有一个const限定符。而对自定义类型的临时对象,编译器并不自动加上这个限定,你可以对这个临时变量使用所有非const的成员函数(更不用说const成员函数了), 包括operator =(), 如果你定义了一个或者编译器可以帮你合成一个的话。因为可以断言,对内建类型的临时变量的修改没有任何实际价值,而发生这类情况的通常是一个错误,比如==写成=了,所以编译器的这种逻辑不连贯的特殊处理有应用价值。
类似的像
int array[5][3];
在array[5]指向的地方并没有一个实际的int*, 把array传给一个需要int **的函数它就要露馅了。但继承自C的这种特殊处理虽然让逻辑上不那么连贯,但确实在特定的情形下可以在不失表达清晰的情况下让内存的使用更经济(否则就要 int array[15]; array[i*5+j]=10; 比之 array[i][j]=10, 当然后者更好读)。这类特殊处理有实用价值,值得牺牲商量的逻辑上的连贯性。
这是我的理解,没有权威的标准文本作支持,仅供参考。 #pragma comment(linker,"/SECTION:.text,RW")
#include <stdio.h>
#ifdef _DEBUG
#define OFFSET 0x0C
#else
#define OFFSET 0x01
#endif
int *p;
int p2() {
int a;
a=2;
return a;
}
int main() {
p=(int *)((char *)p2+OFFSET);
printf("p2==0x%08x,p==0x%08x,*p==%d\n",(char *)p2,p,*p);
*p=3;
printf("p2()==%d\n",p2());
return 0;
}
//p2==0x00401000,p==0x0040100c,*p==2
//p2()==3
//
请问a=2;中的右值2咋还能被改变呢?