VS2010部分支持C++ 11。我在VS2010 RTM中編譯下面的代碼。我很困惑爲什麼代碼CLS()被分析到不同的含義。在「decltype(CLS())obj1;」行中,CLS()表示一個類對象實體。但是在「CLS obj2(CLS());」一行中,CLS()表示一個函數指針,該函數指針不帶參數地回退CLS對象。行爲是否預期?它在標準中有描述嗎?爲什麼CLS()在C++中有不同的含義11
struct CLS
{
int mi;
};
int _tmain(int argc, _TCHAR* argv[])
{
decltype(CLS()) obj1;
obj1.mi = 10;
CLS obj2(CLS());
obj2.mi = 10; // error C2228: left of '.mi' must have class/struct/union
return 0;
}
UPDATE 2011/12/8
每C++ 11 7.1.6.2/1,在括號中的期望的字符串是一個表達式。編譯器只需要檢查該字符串是否可以被解析爲有效的表達式。如果是,則代碼格式良好。因此,對於代碼「decltype(CLS())obj1;」,「CLS()」被視爲表示對象定義的有效表達式。
decltype-specifier:
decltype (expression)
更新2012/1/3
Potatoswatter給出的解釋爲什麼 「CLS OBJ 2(CLS());」是除對象定義之外的聲明。
任何可以被解釋爲表達式或聲明的東西都是一個聲明,但它可能是不尋常的。 CLS obj2(CLS());聲明一個函數,其參數類型CLS()是一個沒有返回CLS參數的函數,其返回類型是CLS。
「任何可能被解釋爲表達式或聲明的東西都是聲明」。在約翰內斯的評論中,他說錯了。我想再次與你確認,這是否正確?如果是的話,你能指出這個規則在C++標準中的定義嗎?我同意。 C++ 11語法避免了這種混淆。 – Jeffrey
@Jeffrey:不,celtschk的錯誤陳述是關於聲明和*定義*之間的歧義。改變定義爲表達將是約翰內斯正在尋找的改正。 – Potatoswatter
我很清楚。謝謝,Potatoswatter。 – Jeffrey