誰かが違いについて尋ねたときdecltype(a)
やdecltype((a))
、いつもの答えは- a
、変数である(a)
式です。私はこの答えはあっけなく見つけます。
まず、a
同様の式です。オプション一次式は、とりわけ-
- (表現)
- ID-表現
さらに重要なのは、decltypeのためのフレージングは非常に、非常に明示的に括弧を考慮します:
For an expression e, the type denoted by decltype(e) is defined as follows:
(1.1) if e is an unparenthesized id-expression naming a structured binding, ...
(1.2) otherwise, if e is an unparenthesized id-expression naming a non-type template-parameter, ...
(1.3) otherwise, if e is an unparenthesized id-expression or an unparenthesized class member access, ...
(1.4) otherwise, ...
質問が残るので。なぜ括弧は異なる扱いをされますか?誰もがその背後にある技術論文や委員会での議論に精通していますか?これは見落としていないので、私は欠けている技術的な理由がなければならないと考えるために、括弧のリードを明示的に考慮。
それは監督ではありません。それはであること、面白いDecltypeとオート(改訂4)(N1705 = 04から0145)の文があります:
decltypeルールは今、明示的にその状態を
decltype((e)) == decltype(e)
(EWGにより示唆されるように)。
しかしにDecltype(リビジョン6):提案された文言(N2115 = 06から018)の変化の一つであります
decltype内部の括弧で囲まれた表現はないと考えられます
id-expression
。
そこ言葉遣いには根拠はありませんが、私はこれは一種decltypeの延長の少し異なる構文を使用して、他の言葉で、それはこれらのケースを区別することを意図していたと仮定しています。
そのための使用はC ++ draft9.2.8.4に示されています:
const int&& foo();
int i;
struct A { double x; };
const A* a = new A();
decltype(foo()) x1 = 17; // type is const int&&
decltype(i) x2; // type is int
decltype(a->x) x3; // type is double
decltype((a->x)) x4 = x3; // type is const double&
何が、本当に面白いです、それがどのように動作するかですreturn
声明:
decltype(auto) f()
{
int i{ 0 };
return (i);
}
私のVisual Studio 2019には、私は冗長な括弧を削除することをお勧めしますが、実際に彼らがに変わりdecltype((i))
その戻り値に変更さint&
れ、それがローカル変数への参照を返すので、UBになります。