gpt4 book ai didi

c++ - MSVC - 使用 void_t 的成员检测无法正常工作

转载 作者:搜寻专家 更新时间:2023-10-31 02:13:56 25 4
gpt4 key购买 nike

前几天我遇到了这个。

#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 兼容的编译器。

最佳答案

MSVC 尚未发布兼容 C++11 的编译器。

他们最大的遗留问题是在 SFINAE 上下文中使用 decltype

他们定期改善情况,使越来越多的 decltype 案例有效,但并不可靠。

当事情出错时,它被破坏的方式通常会产生误报和漏报,并且失败是非局部的,因为您之前使用 SFINAE 表达式的方式可能会改变它下次成功或失败的方式。

您根本无法在 MSVC 中安全地使用基于 decltype 的 SFINAE,除非您仔细解码您的特定版本的 MSVC 可以处理的内容,并且永远不要离开这些界限。我个人觉得他们对什么有效什么无效的描述不够清楚,我觉得我可以可靠地使用它。

关于c++ - MSVC - 使用 void_t 的成员检测无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40593776/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com