我有一些代码:
#include <iostream>
#include <type_traits>
template <bool Approved>
struct concept_model {};
template <typename Impl>
struct endpoint_model {
struct has_method_Impl_foo {
private:
template<typename T>
static constexpr auto check(T*) -> typename
std::is_same<
decltype(std::declval<T>().foo(std::declval<int>())),
void
>::type;
template<typename>
static constexpr std::false_type check(...);
public:
using type = decltype(check<Impl>(0));
static constexpr bool value = type::value;
};
static constexpr bool concept_approved = has_method_Impl_foo::value;
//using model = concept_model<endpoint_model::concept_approved>; // 1
};
struct test_endpoint : public endpoint_model<test_endpoint> {
void foo(int);
};
int main(int argc, char* argv[]) {
constexpr bool approved = test_endpoint::concept_approved;
std::cout << std::boolalpha << approved << std::endl;
return 0;
}
如果第1行被评论endpoint_model::concept_approved
等于true
,则等于false
。它已在最新版本的gcc / msvc / icc / clang(wandbox)上进行了检查。结构endpoint_model
是标准的CRTP,它可以在任何地方使用。 我不明白为什么会这样运作?