3

この単純な 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含まれていることを確認する必要があります (この問題は特にヘッダーにリンクされていません)。

4

1 に答える 1