【发布时间】:2016-11-14 16:46:29
【问题描述】:
前几天我也遇到过这种情况。
#include <iostream>
#include <type_traits>
using namespace std;
template<typename... Ts> struct make_void { typedef void type; };
template<typename... Ts> using void_t = typename make_void<Ts...>::type;
template <class, class = void>
struct is_func_chrend_ : std::false_type {};
template <class T>
struct is_func_chrend_<T, ::void_t<decltype(std::declval<T>().NextTile())>> : std::true_type {};
template <class = void, class = void>
struct is_addable : std::false_type {};
template <class T>
struct is_addable<T, ::void_t<decltype(std::declval<T>() + std::declval<T>())>> : std::true_type {};
int main() {
cout << is_addable<int>::value << endl;
return 0;
}
在 MSVC 中编译时显示 0,如果在 clang 或 gcc 中编译则显示 1。
完全删除is_func_chrend_ 使is_addable 再次正常工作。
Makeshift void_t 仅用于符合 C++11 的编译器。
【问题讨论】:
-
没有调查你的代码,但是VS没有完全实现表达式SFINAE
-
您可能需要绝对最新的 MSVC 才能正常工作。我得到一个带有 VS2015 SP3 的
1。 -
@BoPersson 我在 VS2015 和 VS 15 上都得到 0,据我所知,两者都已完全更新。
标签: c++ c++11 templates visual-c++