VS2010は部分的にC++ 11をサポートしています。以下のコードをVS2010 RTMでコンパイルします。私はなぜコードCLS()が異なる意味で分析されるのか混乱している。行「decltype(CLS())obj1;」において、CLS()はクラスオブジェクトエンティティを示す。ただし、CLS obj2(CLS());行では、CLS()は関数ポインタを示し、パラメータなしでCLSオブジェクトを再実行します。その行動は期待されていますか?それは標準で記述されていますか? C++ 11 7.1.6.2/1当たり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日
、括弧内の予想される文字列が式です。コンパイラは、文字列が有効な式として解析できるかどうかを確認するだけです。はいの場合、コードは整形式です。したがって、コード "decltype(CLS())obj1;"の場合、 "CLS()"はオブジェクトの相違を示す有効な表現として扱われます。
decltype-specifier:
decltype (expression)
UPDATE 2012年1月3日
Potatoswatter説明なぜ与え、 "CLSのOBJ2(CLSを());"オブジェクト定義以外の宣言です。
式または宣言のいずれかと解釈される可能性のあるものはすべて宣言ですが、それは珍しいことです。 CLS obj2(CLS());パラメータ型CLS()がCLSを返す引数を持たず、戻り型がCLSの関数である関数を宣言します。
"式または宣言のいずれかと解釈されるものはすべて宣言です"。ヨハネスのコメントでは、彼は間違って言った。もう一度あなたと確認したい、それは正しい?はいの場合、このルールがC++標準で定義されている場所を指摘できますか?同意する。 C++ 11の構文は、このような混乱を避けています。 – Jeffrey
@Jeffrey:いいえ、celtschkの間違ったステートメントは、宣言と*定義*間のあいまいさに関するものでした。定義を式に変更することは、Johannesが探している修正になります。 – Potatoswatter
それは私には明らかです。ありがとう、Potatoswatter。 – Jeffrey