SFINAE in FDIS

今までのドラフトでは、 SFINAE ではアクセス制限は考慮されませんでした:

class X
{
 private:
  void f() {}
};

#include <iostream>

template< class T >
auto f( T& x, int )
 -> decltype( x.f() )
{
  return x.f();
}

template< class T >
void f( T&, ... )
{
  std::cout << "f( T&, ... )\n";
}

int main()
{
  X x;
  f( x, 0 ); // 今までのドラフトでは f( T&, int ) が呼ばれ、アクセス制限違反でコンパイルエラー
}

しかし、 FDIS においては、アクセス制限チェックも SFINAE の一部として行われるように変更されたようです:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3294.html#1170

つまり、上記コードは f( T&, ... ) を呼び出すようになります。
friend が絡んだ場合にどうなるかは不明。


ともあれ、ユーザ定義リテラルは滅ぶべきであると考える次第である。