今までのドラフトでは、 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
が絡んだ場合にどうなるかは不明。
ともあれ、ユーザ定義リテラルは滅ぶべきであると考える次第である。