c++中,decltype(a=b)和if(a=b),前者a不會被b賦值,後者a會被b賦值,為什麼?

CSDN問答 2022-01-08 08:11:17 阅读数:661

c++ decltype

小白在看c++prime中遇到的問題,

int a = 3, b = 4,d=0;decltype(a = b)c = a;cout << a <<c; //結果是3 3a = b;cout << a << c;//結果是4 4if (a = d);cout << a << d;//結果是0 0

同樣是賦值語句被作為錶達式,此時錶達式的類型是一個int&,

那為什麼decltype(a=b)中a沒有被b賦值,但if(a=d)中a卻被d賦值為0了?




采納答案:

原因非常簡單:C++是靜態類型的語言,這意味著類型是編譯期(compile time)而非運行期(runtime)確定的。decltype的作用是要求編譯器推導錶達式類型,但是並不會對錶達式求值。在樣例代碼中,C++錶達式a=b的返回值是int&型,也就是產生一個int引用c,c=a就是說引用c綁定到了a上。這個過程其實沒有任何求值。

sizeof也是一個道理,你可能注意到下面的代碼輸出結果是1而不是2:

int i = 1;

sizeof(i++);

printf("%d", i);

這是因為sizeof的原理也僅僅是在編譯期進行錶達式類型推導,給出對應類型占用的空間,這個過程與該錶達式在運行期的值一點關系也沒有。

總結:decltype、auto(C++11中的)、模板、sizeof等等原理上是編譯期類型推導的,其運行結果都在編譯期確定,有關錶達式在編譯成的可執行代碼中根本不存在,對運行期結果不產生任何影響。(包括經典的模板斐波那契數列也是一樣的,模板算出的fib數列也是編譯期計算的,產生的是數百個不同的類,而不是一個在運行期進行計算的類。這樣的類運行原理是編譯期計算好了,到了運行期直接調取數據,相當於Look-Up Table,而不是當場計算的。)


版权声明:本文为[CSDN問答]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201080811170834.html