Visual StudioのC++コンパイラにはoperator[が存在するのではないかという疑惑

次のコードは言うまでもなく違法なC++11のコードである。

```cpp
#include <iostream>
enum class E : int {
    arikitari = 0,
    toha = 1,
    nanndarouka = 2
};
static const char* strings[] = { "arikitari", "toha", "nanndarouka" };
int main(){
    std::cout
        << strings[E::arikitari] << std::endl
        << strings[E::toha] << std::endl
        << strings[E::nanndarouka] << std::endl;
    return 0;
}
```

enum classはintegral promotionしないどころかそもそも暗黙の型変換しない。

# GCCのコンパイルエラー

```
prog.cc: In function 'int main()':
prog.cc:10:32: error: array subscript is not an integer
         << strings[E::arikitari] << std::endl
                                ^
prog.cc:11:27: error: array subscript is not an integer
         << strings[E::toha] << std::endl
                           ^
prog.cc:12:34: error: array subscript is not an integer
         << strings[E::nanndarouka] << std::endl;
```

http://melpon.org/wandbox/permlink/HWUkcCJfEJv1zW0A

そりゃそーだ。

# Clangのコンパイルエラー

```
prog.cc:10:19: error: array subscript is not an integer
        << strings[E::arikitari] << std::endl
                  ^~~~~~~~~~~~~
prog.cc:11:19: error: array subscript is not an integer
        << strings[E::toha] << std::endl
                  ^~~~~~~~
prog.cc:12:19: error: array subscript is not an integer
        << strings[E::nanndarouka] << std::endl;
                  ^~~~~~~~~~~~~~~
3 errors generated.
```

http://melpon.org/wandbox/permlink/hwVwMm3cmuCOic57

全く同じエラーだ。

# VSのコンパイルエラー

```
source.cpp(10): error C2677: 二項演算子 '[' : 型 'E' を扱うグローバルな演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。
source.cpp(11): error C2677: 二項演算子 '[' : 型 'E' を扱うグローバルな演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。
source.cpp(12): error C2677: 二項演算子 '[' : 型 'E' を扱うグローバルな演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。
```

は？``operator [``ってなんぞ！？

確かにC++の他の二項演算子はすべてオペランドの間にあるけど、``operator []``だけは例外だから、解析の段階で特別扱いしてそうなものなのに、なんでこんなエラーになるのだろうか。

ちなみにVS2013 update5とVS2015 update3で全く同じエラー吐きます。

# これはバグか？

で、これはバグレポを投げるべきなんだろうか？

# 経緯

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">C++「うちもそうやで」 <a href="https://t.co/bybbE6H0TY">https://t.co/bybbE6H0TY</a></p>&mdash; yumetodo-C++erだけど化学科 (@yumetodo) <a href="https://twitter.com/yumetodo/status/760284143460556801">2016年8月2日</a></blockquote>
<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/yumetodo">@yumetodo</a> え、enumでキャストした記憶がないのですが……</p>&mdash; YSR@WPF分かりません (@YSRKEN) <a href="https://twitter.com/YSRKEN/status/760297577191473152">2016年8月2日</a></blockquote>
<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/YSRKEN">@YSRKEN</a> えっ。<a href="https://t.co/gEWU6Bclph">https://t.co/gEWU6Bclph</a></p>&mdash; yumetodo-C++erだけど化学科 (@yumetodo) <a href="https://twitter.com/yumetodo/status/760458220846604289">2016年8月2日</a></blockquote>
<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/yumetodo">@yumetodo</a> VSだと「error C2677: 二項演算子 &#39;[&#39; : 型 &#39;E&#39; を扱うグローバルな演算子が見つかりません (または変換できません)」……</p>&mdash; YSR@WPF分かりません (@YSRKEN) <a href="https://twitter.com/YSRKEN/status/760459074525814785">2016年8月2日</a></blockquote>
<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/yumetodo">@yumetodo</a> とりあえず、「E::ナントカ」という変数は、直接[]の引数などには使えないものの、「intへの暗黙の型変換」はできず(明確にstatic_castすればセーフ)、先のwandboxでもE::の手前に(int)など付けてキャストすればセーフでした</p>&mdash; YSR@WPF分かりません (@YSRKEN) <a href="https://twitter.com/YSRKEN/status/760460446839083008">2016年8月2日</a></blockquote>
<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/yumetodo">@yumetodo</a> 要するに、VS的には「enum classなんだからそのまま引数なはずがない……ハッ！手前の&#39;[&#39;がキャスト用の型では！？」といった解釈をしているのではないかと思われます</p>&mdash; YSR@WPF分かりません (@YSRKEN) <a href="https://twitter.com/YSRKEN/status/760460654469713920">2016年8月2日</a></blockquote>