ゆとりーなの日記

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

詳しい人に丸投げシリーズ

g++4.5.1でこのコードがコンパイルエラーになるわけですね。

#include <iostream>
 
class foo {
  int hoge() const {
    return 0;
  }
  
  friend struct access;
};
 
struct access {
  template <typename T>
  static auto get(const T &f) -> decltype(f.hoge()) {
    return f.hoge();
  }
};
 
int main() {
  foo f;
  std::cout << access::get(f) << std::endl;
}
'int foo::hoge() const' is private

って言われるんですけど、どうもdecltype(f.hoge())の部分でfriendが上手く効いてない?みたいです。例によってMSVCではコンパイルが通るので、規格的にはどちらが正しいのかが気になるところです。
因みに、

#include <iostream>
 
class foo {
  int hoge() const {
    return 0;
  }
  
  friend struct access;
};
 
struct access {
  static auto get(const foo &f) -> decltype(f.hoge()) {
    return f.hoge();
  }
};
 
int main() {
  foo f;
  std::cout << access::get(f) << std::endl;
}

ならg++でも特に何も言われないみたいです。