2017-02-21 236 views
2

我發現它們不同,語言標準說明每個語句應該檢索哪種類型(變量和表達式之間的區別)。但我真的很想知道爲什麼這兩種類型應該有所不同?C++ 11爲什麼'decltype(x)'和'decltype((x))'的類型不同?

#include<stdio.h> 
int x=0; 
decltype((x)) y=x; 
int main() 
{ 
    y=2; 
    printf("%d,",x); 
    decltype((1+2))&z=x;//OK (1+2) is an express, but why decltype should differ? 
    z=3; 
    printf("%d\n",x); 
    return 0; 
} 

運行結果是 '2,3'

那麼,爲什麼decltype((INT))是由設計INT &,什麼是C的代價++語言的設計在這裏?任何需要這種設計的語法一致性? (我不希望得到「This is by design」)

感謝您的解釋。

+0

@some我沒有看到有關的解釋 –

+0

@ JohannesSchaub-litb添加了報價的答案 –

+1

您最好的機會是閱讀「decltype」的提議,我想。谷歌搜索「decltype wg21提案」給出了一些有趣的論文。 –

回答

1

如果您閱讀例如this decltype reference你會看到

2)如果參數爲加括號 ID-表達或加括號類成員訪問表達式,...

3)如果參數爲任何其他表達 ...

... b)如表達式的值類別是左值,然後decltype產量T&;

[重點煤礦]

再稍進一步下跌的音符

注意,如果一個對象的名稱括弧,它是作爲一個普通的左值表達式處理,因此decltype(x)decltype((x))通常是不同的類型。

因爲您使用括號表達式它被視爲一個左值,這意味着上述3.B是活性和decltype((x))給你int&如果xint

應該指出的是,儘管參考文獻並非權威性的,但是它是從規範中推導出來的,並且通常可靠和正確。


從C++ 11規範ISO/IEC 14882:2011,節7.1.6.2 [dcl.type.simple],子部分4:

通過decltype(e)表示的類型是定義如下:

- 如果e是一個括號的ID-表達或加括號的類的成員訪問(5.2.5),decltype(e)是由e命名實體的類型。如果沒有這樣的實體,或者如果命名一組重載函數,則該程序是不合格的;

- 否則,如果e是一個x值,decltype(e)T&&,其中Te類型;

- 否則,如果e是左值,decltype(e)T&,其中Te類型;

- 否則,decltype(e)e

的類型和用一個例子:

struct A { double x; }; 
const A* a = new A(); 
... 
decltype((a->x)) x4 = x3; // type is const double& 

基本上正是以前鏈接參考所述。

以您爲例,規範中的e(x)(因爲您有declspec((x)))。現在第一個案件不適合,因爲(x)不是一個不親密的表達式。第二種情況不適合,因爲(x)不是xvalue。第三種情況匹配,但(x)int類型的左值,導致decltype((x))int&

因此,對您的查詢的答案很簡單:因爲規範是這樣說的。

+0

我在這裏看不到這種行爲的解釋。 –

+0

謝謝,但我在這裏沒有看到任何解釋,這只是我的問題的複製,我問他們爲什麼不同? –

+0

@HindForsum午餐後我會盡量從規範中找到相關部分。但你會看到他們說的是一樣的。所以*真實*答案將僅僅是:因爲規範說明了這一點! –

相關問題