ゆとりーなの日記

日記的な事を書いて行くと思はれる

そういえばそんな記法あったなと思ったけど駄目だった

前から気になってたので早速読んでみました。

C/C++プログラミングの「迷信」と「誤解」
C/C++プログラミングの「迷信」と「誤解」高木 信尚

技術評論社 2011-03-17
売り上げランキング : 93783


Amazonで詳しく見る
by G-Tools
なかなか兇悪な例もあって面白かったです。対応する規格の文面が出てくるのもありがたいです。C++とCの微妙な違いなんかも久々に意識しました。プログラマ間の話のネタにもなっていい感じです。
で、ふと読んでて思い出したんですが、そういえばこういう表記があったんです。

#include <iostream>

int main() {
  const int c_array[5] = {0, 1, 2, 3, 4};
  std::cout << 4[c_array] << std::endl;
  return 0;
}

これで4が出力されるわけですね。添え字と配列変数をひっくり返せるってネタは初めて聞いたときうわーって思ったものです。
そういえばstd::arrayも組み込み配列のような挙動を再現するならこの様に書けてもいいのではないかと思うわけです。

#include <array>
#include <iostream>

int main() {
  const std::array<int, 5> cpp_array = {0, 1, 2, 3, 4};
  std::cout << 4[cpp_array] << std::endl;
  return 0;
}

しかし当然こいつはコンパイルエラー。昔どこかで0xからはoperator []がグローバル定義できるようになるよって噂を聞いたことがあったので、試しに

int operator [](const int index, const std::array<int, 5> &array) {
  return array[index];
}

とか書いてみたところ見事撃沈。n3242を見直してみたらoperator []は非staticなメンバ関数じゃないと駄目よ的なことが書いてあった感じなので、この野望は潰えました。
因みに添え字と配列変数をひっくり返せるよってネタはこの本では

#define HOGE -1

見たいなのを

#define HOGE (-1)

と括弧付けにする方がよいかという話のところで出てきます。