1
我以爲我明白static_assert
是如何工作的。但是,當我想這對G ++編譯器,我開始懷疑:如果未實例化成員模板,是否要評估static_asserts?
#include <iostream>
#include <type_traits>
#define ENABLE_IF(...) std::enable_if_t<__VA_ARGS__, int> = 0
template<typename...Ts>
struct list{};
template<typename...Ts>
struct is_one_of;
template<template <typename...> class TT, typename T, typename T1, typename...Ts>
struct is_one_of<T, TT<T1, Ts...>> : is_one_of<T, TT<Ts...>> {};
template<template <typename...> class TT, typename T, typename...Ts>
struct is_one_of<T, TT<T, Ts...>> : std::true_type {};
template<template <typename...> class TT, typename T>
struct is_one_of<T, TT<>> : std::false_type {};
template<typename...Ts>
struct X;
template<typename P, typename T, typename...Ts>
struct X<P, T, Ts...> : X<P, Ts...>
{
using X<P, Ts...>::fn;
template<typename R, ENABLE_IF(std::is_same<T, R>::value)>
constexpr auto fn(R&& x)
{
return x;
}
};
template<template <typename...> class TT, typename...Ts>
struct X<TT<Ts...>>
{
template<typename R, ENABLE_IF(!is_one_of<R, TT<Ts...>>::value)>
constexpr auto fn(R&& x)
{
static_assert(false, "Type R didn't match");
}
};
template<typename...Ts>
struct XX : X<list<Ts...>, Ts...> {};
int main() {
XX<int, float> x;
std::cout << x.fn(int(3)) << std::endl;
return 0;
}
現在我本來以爲不會有任何方式的基本類型X<TT<Ts...>>
可能曾經被實例化,因爲它永遠不會被調用。通過這個推理,它不應該導致static_assert
失敗。
這對失敗G ++(5.4.0)和鐺(3.9.1),但工作在VC++ 2015
這是一個缺陷還是我失去了一些東西?