T. *_*out 6 c++ visual-c++ c++14
考虑一个简单的效用函数来计算连接,并使用此实用程序来确保a std::tuple中的类型都相等.
#include <type_traits>
#include <tuple>
constexpr auto all() noexcept -> bool { return true; }
template <class... Bools>
constexpr auto all(bool const x, Bools... xs) noexcept -> bool
{
return x && all(xs...);
}
template <class T, class = void>
struct foo;
template <class T, class... Ts>
struct foo< std::tuple<T, Ts...>
, std::enable_if_t<all(std::is_same<T, Ts>::value...)>
> {
};
int main()
{
foo<std::tuple<int, int>> x;
}
Run Code Online (Sandbox Code Playgroud)
GCC和Clang对此代码很好,但MSVC不是.这是一个Godbolt链接.所以我想知道,这是一个MSVC错误还是只是我错过了什么?
我猜这是一个 MSVC 错误。如果支持 C++17,我建议改用std::conjunction。在 C++14 下,作为一种解决方法,可以从前一个链接复制“可能的实现”:
#include <type_traits>
#include <tuple>
template<class...> struct conjunction : std::true_type { };
template<class B1> struct conjunction<B1> : B1 { };
template<class B1, class... Bn>
struct conjunction<B1, Bn...>
: std::conditional_t<bool(B1::value), conjunction<Bn...>, B1> {};
template<class... B>
constexpr bool conjunction_v = conjunction<B...>::value;
template <class T, class = void>
struct foo;
template <class T, class... Ts>
struct foo< typename std::tuple<T, Ts...>
, std::enable_if_t<conjunction_v<std::is_same<T, Ts>...>>
> {
};
int main()
{
foo<std::tuple<int, int>> x;
}
Run Code Online (Sandbox Code Playgroud)