2010-02-09

MSVC曰く「decltypeはoperator(キリッ」

          ____   
       / \  /\ キリッ
.     / (ー)  (ー)\      
    /   ⌒(__人__)⌒ \    
    |      |r┬-|    |      MSVC曰く、「decltypeはoperator」
     \     `ー'´   /      
    ノ            \
  /´               ヽ              
 |    l              \
 ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、.    
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))


          ____
        /_ノ  ヽ、_\
 ミ ミ ミ  o゚((●)) ((●))゚o      ミ ミ ミ
/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\   /⌒)⌒)⌒)
| / / /     |r┬-|    | (⌒)/ / / //  だっておwwwwwwwwwwwwwwwwwww
| :::::::::::(⌒)    | |  |   /  ゝ  :::::::::::/    type specifierにきまってるおwwwwwwwwwwwwwww
|     ノ     | |  |   \  /  )  /
ヽ    /     `ー'´      ヽ /    /     バ
 |    |   l||l 从人 l||l      l||l 从人 l||l  バ   ン
 ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、    ン
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))

Expressions with Unary Operators
decltype Operator

うーむ? MSVC的には、decltypeはoperatorなのか。type specifierだろうに。

Simple Type Names

やばい、本当にoperatorだと信じているようだ。type specifierの項目には載っていない。そもそも、namesじゃなくてspecifiersであるべきなのだが、なんだこのドキュメントは。

しかし、もし本当にdecltypeがoperatorだとするならば、expressionである。とするならば、

decltype( decltype(0) ) ;

このコードはコンパイルが通るはずである。なぜならば、decltypeは、decltype(expression)という文法だからだ。decltypeは、type specifierを取ることはできない。したがって、decltype(int)というのは、ill-formedであるように、decltypeの中にdecltypeを記述することはできない。しかし、もし本当に、MSVCがdecltypeをoperatorだと考えているならば、できるはずである。

果たしてVC10Beta2では、通らなかった。しかも、

error C3553: decltype expects an expression not a type

というエラーメッセージまで出すではないか。decltypeはexpressionではないのだから、これは規格準拠で当然だ。しかし、このドキュメントはなんだろう。

まともに規格通りのドキュメントが書けないから、コンパイラもマヌケな事になってるんじゃないか。

それはそうと、VS2010のRC版が、明後日あたりに公開されるらしい。

No comments: