この単純な SFINAE テストを検討して、型が引数になるかどうかを判断してください。std::begin
#include <utility>
template <class T> constexpr auto
std_begin_callable (T const*) -> decltype (std::begin (std::declval <T>()), bool ())
{ return true; }
template <class> constexpr bool
std_begin_callable (...)
{ return false; }
#include <array>
static_assert (std_begin_callable <std::array <int, 3>> (0), "failed");
int main () {}
SFINAE 関数の後に特殊化が定義されているarray
ヘッダーが含まれていることに注意してください。アサーションは失敗します。今、前に移動すると動作します。(gcc 4.8.0 20130411、clang バージョン 3.2)std::begin
#include <array>
理由がわかりません。SFINAE 関数はテンプレートです。静的アサーションで、テストする関数を定義するヘッダーを含めた後、必要に応じてインスタンス化するべきではありませんか?
問題は、私の SFINAE がヘッダーにあることです。それが他のコンテナー ヘッダーの後にarray
含まれていることを確認する必要があります (この問題は特にヘッダーにリンクされていません)。